我是Visual Studio 2010项目配置的新手,但我做了一些研究,仍然不能完全解决这个问题。我有一个Visual Studio解决方案的c++ DLL引用c# DLL。c# DLL引用了一些其他DLL,一些在我的项目内,一些在外部。当我试图编译c++ DLL时,我得到这个警告:

警告MSB3270:正在构建的“MSIL”项目的处理器架构与参考“[内部c# dll]”,“x86”的处理器架构之间不匹配。

它告诉我去配置管理器调整我的架构。c# DLL是用目标平台x86建立的。如果我尝试将其更改为其他东西,如任何CPU,它会抱怨,因为它所依赖的外部dll之一具有平台目标x86。

当我查看配置管理器时,它显示了我的c# DLL作为x86和我的c++项目作为Win32的平台。这似乎是正确的设置;当然,我不希望我的c++项目的项目平台设置为x64,这是唯一的其他选项。

我哪里做错了?


当前回答

我以前遇到过类似的问题,特别是在向现有的x64解决方案(如SharePoint)添加测试解决方案时。在我的例子中,这似乎与默认情况下某些项目模板被添加为某些平台有关。

Here's the solution that often works for me: set everything to the correct platform in the Configuration Manager (the active configuration drop-down, says Debug normally, is a good way to get to it) and project platform (in project properties), then build, then set everything back to AnyCPU. Sometimes I have to remove and re-add some dependencies (DLLs in each project's Properties) and sometimes the "Run tests in 32 bit or 64 bit process" (double-click Local.testsettings and go to Hosts) has to be changed.

在我看来,这只是设定了一些事情,然后又把它放回去,但在幕后可能有更多我没有看到的事情发生。不过在过去,这对我来说是相当稳定的。

其他回答

For C# projects, the target of x86 does what it sounds like. It says that this assembly only supports x86 architectures. Likewise for x64. Any CPU on the other hand says that I don't care which architecture, I support both. So, the next 2 questions are (1) what is the configuration of the executable that uses these dlls? and (2) what is the bitness of your OS/Computer? The reason I ask is because if your executable is compiled to run in 64-bit, then it NEEDS all dependencies to be able to run in 64-bit mode as well. Your Any CPU assembly should be able to be loaded, but perhaps it is referencing some other dependency that is only capable of running in x86 configuration. Check all dependencies and dependencies-of-dependencies to make sure everything is either "Any CPU" or "x64" if you plan to run the executable in 64-bit mode. Otherwise, you'll have issues.

在许多方面,Visual Studio并没有使编译任意CPU和各种依赖于体系结构的程序集的混合变得容易。这是可行的,但它通常要求必须针对x86和x64分别编译“任何CPU”的程序集,因为某个依赖的某个依赖有两个版本。

c# DLL是用目标平台x86建立的

这就是问题所在,DLL实际上无法选择进程的比特数。这完全由EXE项目决定,这是加载的第一个程序集,所以它的平台目标设置是为进程计数和设置位。

dll没有选择,它们需要与进程位相兼容。如果它们不是,那么当你的代码试图使用它们时,你会得到一个大的爆炸和BadImageFormatException。

因此,对于dll来说,一个很好的选择是AnyCPU,这样它们就可以以两种方式工作。这对于c# dll来说很有意义,它们可以以任何一种方式工作。但当然,不是您的c++ /CLI混合模式DLL,它包含非托管代码,只有在进程以32位模式运行时才能很好地工作。您可以让构建系统生成关于此的警告。这正是你得到的。只是警告,它仍然可以正确构建。

把这个问题撇在一边。将EXE项目的平台目标设置为x86,它将无法与任何其他设置一起工作。并将所有DLL项目保存在AnyCPU中。

使用https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build # directorybuildprops-example:

在解决方案文件夹中添加一个Directory.Build.props文件 把这个粘贴进去:

<Project>
 <PropertyGroup>
   <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
 </PropertyGroup>
</Project>

我只是把平台目标从属性改为“任何CPU”,就完成了! 也许你应该创建一个发布版本。

这样做:

我解决了这个警告,将“配置管理器”更改为发布(混合平台)。