我有一个包含C#和托管C++项目的解决方案。它在解决方案平台x64和x86中编译。因为它是托管的,所以我想创建一个“任何C++”的解决方案,并摆脱旧的解决方案。
我将C++项目链接器设置更改为强制x64和x86的安全IL图像。
接下来,使用Configuration Manager,我创建了一个新的解决方案平台,名为“Any CPU”。接下来,我添加了一个项目平台,也称为“任意CPU”。
我继续将所有的C#项目设置为'Any CPU',但是对于C++我不能这么做。项目平台“Any CPU”不在下拉列表中,也没有“New...”选项。
VS是对它的补充,所以我保持了它的原样,并开始构建。令我惊讶的是,结果DLL (来自C++项目)是MSIL,尽管C++的平台是x64。编译x32时也会发生同样的情况,生成的DLL是MSIL格式的。
怎么回事?为什么我不能将C++项目设置为'Any CPU'?
发布于 2015-02-03 12:39:20
据我所知,您不能在Visual Studio中为C++/CLI项目创建"AnyCPU“项目类型。但是,您可以配置您的C++/CLI项目(在"Win32“项目类型下),使其编译为纯、安全的MSIL,而无需目标平台。这样做将允许您的C++/CLI程序集与"AnyCPU“C#项目一起使用。也就是说,它实际上是"AnyCPU",即使这不是它在配置管理器中的实际名称。
在"C/C++“项目设置中:
Safe MSIL Common Language RunTime Support (/clr:safe)
对
在"Linker“项目设置中:
IJW
或PURE
即可
备注:
发布于 2016-11-23 01:32:02
为了让C++动态链接库使用C#功能,C++项目必须生成动态链接库的x86和x64版本。不能仅从使用AnyCPU设置编译的C# dll中引用x86或x64 dll。
让AnyCPU动态链接库使用C++动态链接库的诀窍是,在运行时确保程序集无法加载C++动态链接库,然后订阅AppDomain AssemblyResolve事件。当程序集尝试加载dll但失败时,您的代码有机会确定需要加载哪个dll。
订阅事件如下所示:
System.AppDomain.CurrentDomain.AssemblyResolve += Resolver;
事件处理程序如下所示:
System.Reflection.Assembly Resolver(object sender, System.ResolveEventArgs args)
{
string assembly_dll = new AssemblyName(args.Name).Name + ".dll";
string assembly_directory = "Parent directory of the C++ dlls";
Assembly assembly = null;
if(Environment.Is64BitProcess)
{
assembly = Assembly.LoadFile(assembly_directory + @"\x64\" + assembly_dll);
}
else
{
assembly = Assembly.LoadFile(assembly_directory + @"\x86\" + assembly_dll);
}
return assembly;
}
我已经创建了一个简单的项目,演示如何从AnyCPU动态链接库访问C++功能。
https://stackoverflow.com/questions/28280101
复制相似问题