发布
社区首页 >问答首页 >C++/C#解决方案中不可用的任何CPU

C++/C#解决方案中不可用的任何CPU
EN

Stack Overflow用户
提问于 2015-02-02 22:36:00
回答 2查看 13K关注 0票数 18

我有一个包含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'?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)

  • 公共语言RunTime的支持

在"Linker“项目设置中:

  • CLR镜像类型:只需确保未显式设置为IJWPURE

即可

备注:

  • 通过使用“安全”项目类型,一些似乎影响平台类型的编译器和链接器选项将被忽略。也就是说,您不必将所有内容都设置为非特定的平台类型。就是上面这几个。但你可以将其他选项设置为适当的选项,如果这会让你感觉更好的话。:)
  • "Safe“将阻止使用指针。如果这是一个重要的问题,显然是可以做到的,尽管有一个更复杂的过程。参见用于details.
  • Don't的Creating a pure MSIL assembly from a C++/CLI project?忘记在默认情况下,Visual Studio将创建C#项目,即使它们是"AnyCPU“的,即使它们在64位操作系统上执行,也将作为32位进程启动。如果依赖项是x86而不是预期的纯/安全MSIL,这可以隐藏平台不匹配问题。只需注意一些事情(您可以通过取消选中C#项目“构建”项目属性页面中的“首选32位”选项来控制这一点)。
票数 16
EN

Stack Overflow用户

发布于 2016-11-23 01:32:02

为了让C++动态链接库使用C#功能,C++项目必须生成动态链接库的x86和x64版本。不能仅从使用AnyCPU设置编译的C# dll中引用x86或x64 dll。

让AnyCPU动态链接库使用C++动态链接库的诀窍是,在运行时确保程序集无法加载C++动态链接库,然后订阅AppDomain AssemblyResolve事件。当程序集尝试加载dll但失败时,您的代码有机会确定需要加载哪个dll。

订阅事件如下所示:

代码语言:javascript
代码运行次数:0
复制
System.AppDomain.CurrentDomain.AssemblyResolve += Resolver;

事件处理程序如下所示:

代码语言:javascript
代码运行次数:0
复制
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://github.com/kevin-marshall/Managed.AnyCPU

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28280101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档