.NET应用程序使用Any CPU加载混合dll

时间:2014-03-03 10:05:06

标签: .net mixed-mode anycpu

我是创建.NET应用程序的新手,特别是混合应用程序。

最近我在(非托管)C ++(在MS Visual Studio 2010下)为客户端创建了一组(静态)库,支持32位和64位编译,这些编译由某些应用程序加载,一般都很好。 (内部此功能使用各种其他第三方库,如OpenGL,boost,glm等)

现在,他希望能够使用我在C#应用程序中作为自定义控件提供的一些功能。

所以我创建了一个支持CLR的dll,使用C ++ / CLI为我的功能创建包装类,然后去创建一个公共的自定义WPF控件(因此可以从外部访问),再次它可以正常工作以32位和64位构建。

然后为了测试我创建了一个简单的C#应用​​程序(它非常简单,因为我是C#的新手,我的背景是C / C ++),它可以构建为32位或64位,并且可以成功加载控件从我的DLL中完成预期的操作。

我现在遇到的问题是他说他希望能够只将一个可执行文件分发为“任何CPU”,然后根据它的启动位置加载适当的代码(即32位或64位)。 / p>

所以我所做的是在C#测试项目中添加“Any CPU”配置,并将“build”选项卡下的“platform target”设置为“Any CPU”。但是现在我不确定在Configuration Manager下为其他项目设置了什么平台(即C ++静态库,由C ++ / CLI混合模式dll使用)。因此,对于测试我将其保留在x64,但是当我构建它时,我收到警告:

Warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "(name of my 64 bit dll)", "AMD64".  <br /> 
This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.

然而它运行正常,即使它给了我警告。当我将其他项目设置为“Win32”时,我得到相同的警告,只是提到“x86”,但在这种情况下,它会在启动时抛出一个异常,说“在PresentationCore.dll中发生了'System.BadImageFormatException'类型的未处理异常“

那么我需要将其更改为什么?如何使其加载可执行文件,然后决定加载哪个DLL?我真的不确定如何继续按照我要求的方式开展工作。

1 个答案:

答案 0 :(得分:2)

我在一篇关于使用Perforce库的文章中找到了问题的解决方案:

http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/

基本上你必须创建一个代理dll,它是你的输出目标,并用作托管C#(在我的案例中是WPF)应用程序的参考。

然后创建dll的x64和x86版本,您可以将其与可执行文件一起提供。您必须确保代理dll不与可执行文件一起存在。

在启动时,您将为AppDomain.CurrentDomain.AssemblyResolve创建一个事件处理程序,当它找不到代理dll时将触发该事件处理程序。

然后根据您是在32位还是64位环境中,它可以选择正确的dll并加载它。