C#在不同平台下DLL的引用问题
缘起
很多时候,我们需要引用在不同平台下的DLL,32位(X86)和64位(X64)。如果平台错误,在C#中会引发BadImageFormatException异常。
解决思路
我们同时不能添加不同平台下的DLL,即使名称不一样(会报类型同时存在于两个DLL中)。能不能只在某种平台下引用,在其他平台下不引用呢?
VS工程的配置都保存在配置文件(.csproj)中。在VS中,找到相应的项目,右键选择卸载项目,完成后项目变为灰色。然后在项目上单击右键,选中编辑(项目名称).csproj。这们我们就可以查看VS工程文件。如下图:
在其中,我们发现有Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "。猜想$(Platform)是具体的平台,包括AnyCPU、X86、X64。Condition表示条件。我们通过修改Debug和Release情况下的配置可以验证这一点(在工程的属性->生成标签页中可修改)。
这正是我们在VS工程中所引用的DLL,那我们试试在其中能否设置Condition,答案是可以,
那么我们尝试着在不同平台上添加不同的条件,如下图:
经过验证,我们发现,成功了……
扩展
Condition除了可以用==以外,还可以用!=,<, >, <=, >=等关系操作符,!,And,Or等逻辑操作符,详见MSBuild Conditions。
VS工程文件中包含Properties(定义于PropertyGroup中)
和ItemGroups (定义在ItemGroup中)两种类型的变量。$(PropertyName) 可引用所有定义在
PropertyGroup中的变量,详见
MSBuild的简单介绍与使用
。
在VS工程文件中最下面还有一行注释了的代码,这就是著名的生成前和生成后事件
关于MSBuild的更多知识,感兴趣的可以查看MSDN相关文档。
平台和平台目标
平台是指在配置管理器中定义的平台(位于生成菜单下),对应于Platform
平台目标是指在项目生成属性中设置的目标平台,对应于PlatformTarget
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】