Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET应用程序使用任何CPU加载混合dll_.net_Mixed Mode_Anycpu - Fatal编程技术网

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

.NET应用程序使用任何CPU加载混合dll,.net,mixed-mode,anycpu,.net,Mixed Mode,Anycpu,我不熟悉创建.NET应用程序,尤其是混合应用程序 最近我为一个(非托管)C++(在MS Visual Studio 2010)下的客户端创建了一组(静态)库,支持由一些应用程序加载的32位和64位编译,并且通常是很好的。(该功能在内部使用各种其他第三方库,如OpenGL、boost、glm等) 现在,他希望能够使用我在他的C#应用程序中作为自定义控件提供的一些功能 因此,我创建了一个支持CLR的dll,使用C++/CLI为我的功能创建包装类,然后创建了一个自定义WPF控件,该控件是公共的(因此可

我不熟悉创建.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位)

因此,我所做的是在C#test项目中添加一个“Any CPU”配置,并将“build”选项卡下的“platform target”设置为“Any CPU”。但现在我不确定在配置管理器下,为其他项目设置什么平台(即C++静态LIBS,由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.
警告MSB3270:正在生成的项目的处理器体系结构“MSIL”与引用(我的64位dll名称)“AMD64”的处理器体系结构不匹配
这种不匹配可能会导致运行时失败。请考虑通过配置管理器更改项目的目标处理器体系结构,以便在项目和引用之间对齐处理器体系结构,或者依赖于与您项目的目标处理器体系结构相匹配的处理器体系结构的引用。
然而,它运行良好,尽管它给了我这个警告。当我将其他项目设置为“Win32”时,我收到了相同的警告,只是提到了“x86”,但在这种情况下,它在启动时抛出一个异常,表示“PresentationCore.dll中发生了未处理的“System.BadImageFormatException”类型的异常”


那么我需要把它改成什么呢?如何让它加载可执行文件,然后决定加载哪个dll?我真的不知道如何按照我要求的方式继续并使其工作。

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

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

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

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


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

感谢您记录您的发现。但是,这太模糊了。用真实的(或接近真实的)例子详细地、一步一步地解释你实际做了什么是有用的。