我是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,这是唯一的其他选项。

我哪里做错了?


当前回答

There should be a way to make a .NET EXE/DLL AnyCPU, and any unmanaged DLLs it depends on compiled both with x86 and x64, both bundled perhaps with different filenames and then the .NET module dynamically loading the correct one based on its runtime processor architecture. That would make AnyCPU powerful. If the C++ DLL only supports x86 or x64 then AnyCPU is of course pointless. But the bundling both idea I have yet to see implemented as the configuration manager does not even provide a means to build the same project twice with a different configuration/platform for multiple bundling allowing AnyCPU or even other concepts like any configuration to be possible.

其他回答

我得到的警告和我做的一样

卸载项目 编辑项目属性,即。csproj 添加以下标签: < PropertyGroup > < ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch > 没有一个 < / ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch > < / PropertyGroup > 重新加载项目

一个好的经验法则是“打开dll,关闭ex”,也就是说:

EXE的目标操作系统,通过指定x86或x64。 dll是开放的(即AnyCPU),因此可以在32位或64位进程中实例化它们。

当您将EXE构建为AnyCPU时,您所做的一切都是将使用哪个进程位的决定推迟到操作系统,这将JIT EXE到它喜欢的程度。也就是说,x64操作系统将创建64位进程,x86操作系统将创建32位进程。

将dll构建为AnyCPU可以使它们与任一进程兼容。

有关程序集加载的更多细节,请参见这里。执行摘要如下所示:

AnyCPU -加载为x64或x86程序集,取决于调用进程 X86 -加载为X86汇编;不能从x64进程加载 X64 -加载为X64程序集;不能从x86进程加载

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

这样做:

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

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

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

我今天遇到了这个问题,只是在Visual Studio中查看建筑配置并没有帮助,因为它显示了没有建造的项目和引用项目的任何CPU。

然后我在参考项目的csproj中找到了这个:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>

不知怎么的,这个PlatformTarget是在配置更改的过程中添加的,而IDE似乎没有看到它。

从引用的项目中删除这一行解决了我的问题。