Victor's blog

Stay hungry, stay foolish.

0%

C#根据架构类型引用32或64位的DLL

前言

前段时间,应要求需要把现有的UWPElectron应用兼容32位系统,在很多情况下可以分别引用32或64位的dll来打包程序(偷懒的情况下😅),毕竟也是分开提供给用户下载的。甚至对于内存要求不高的程序来说,只提供32位的程序都行😁但对于UWP应用来说,由于Xbox只支持64位,这时两种架构就要都兼容了。并且微软应用商店同一个版本号只能上传一个包,这意味着我们需要将64和32位合并在一个包里面。

正文

引用类型大致分为直接引用或在代码中动态引用

例如解决方案同级目录有一个文件夹RefDlls,里面分别是x86x64这2个文件夹,然后这两个文件夹里放的是我们引用的dll:Mylib.dll

对于直接在项目中引用

我们需要用文本编辑器打开项目文件(*.csproj),以如下方式引用dll:

1
2
3
4
5
6
7
<ItemGroup>
<Reference Include="Mylib.dll">
<!-- <HintPath>..\RefDlls\x86\Mylib.dll</HintPath> -->
<!-- <HintPath>..\RefDlls\x64\Mylib.dll</HintPath> -->
<HintPath>..\RefDlls\$(Platform)\Mylib.dll</HintPath>
</Reference>
</ItemGroup>

很明确了,以上代码是使用$(Platform)来代替文件夹名称名称。

这个方法对于直接保存在项目中的dll文件同样适用:

如有Mylib_x86.dllMylib_x64.dll两个dll在Assets项目文件夹中,我们也可以在项目中通过预编译符来引用,具体如:

1
2
3
4
5
<ItemGroup>
<!-- <Content Include="Assets\Mylib_x86.dll" /> -->
<!-- <Content Include="Assets\Mylib_x64.dll" /> -->
<Content Include="Assets\Mylib_$(Platform).dll" />
</ItemGroup>

这时只需要保留这一个引用,原来针对x86x64的引用就可以删除了,在编译时会使用自动引用对应的dll在项目中。

动态引用

这种情况相对比较好处理,使用条件编译符号即可。进入条件编译符号设定界面:项目-右键菜单-属性-生成

在条件编译符号中加入对应平台字符串,具体是在x86平台追加WIN32x64平台下追加WIN64,如下图:

注意:Debug与Release模式需要分别设置

最后,在代码中使用DllImport来导入时增加条件编译符号的判断就行啦😁😁

1
2
3
4
5
6
#if WIN64
[DllImport("Assets\\Mylib_x64")]
#else
[DllImport("Assets\\Mylib_x86")]
#endif
private static extern Int32 MethodName(string[] args);