在x64配置下正确复制程序集,但不是x86

时间:2013-02-08 03:03:19

标签: .net dll msbuild visual-studio-2012 x86-64

我有两个项目.NET 4.5 C#解决方案,一个项目(projectA)是一个包含5个引用的.dll(非COM)文件的类库。这些文件是特定于32/64位的,因此我的构建路径中包含两个include /文件夹(包括/ x86 /和include / x64 /),每个文件中包含各自的.dll文件。 .dll在32位和64位版本之间的名称完全相同。另一个项目(projectB)是一个引用projectA的控制台应用程序。当我配置为Debug(或Release,无关紧要)x64模式和构建时,一切正常。它将所有5 .dll复制到bin / x64 /目录,程序按预期工作。但是,当我将配置切换到x86模式并构建时,五个.dll中只有两个被复制到bin / x86 /目录,程序显然不起作用。它抛出FileNotFoundException并抱怨程序集未加载,因为它无法在bin /目录中找到它。

如果我将缺少的.dll文件手动复制(或在后期构建事件中使用xcopy)到bin / x86 /文件夹,程序可以运行。所以看起来这个问题与Visual Studios(2012 Update 1)有关,在构建期间没有正确复制文件。 projectA中的所有5个引用都设置为Copy:Local,它们在Visual Studio的Properties框中的路径对于x86和x64模式都是正确的。当我自己构建projectA时,在x86-64模式下,所有5 .dll都被正确复制到正确的bin /文件夹。所以问题还必须处理projectB引用projectA。

以下是projectA.csproj文件的摘录:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
   <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
   <PlatformTarget>x86</PlatformTarget>
</PropertyGroup>

<ItemGroup>
<Reference Include="BaseCommon">
  <HintPath>include\$(Platform)\BaseCommon.dll</HintPath>
</Reference>
<Reference Include="BaseDataAccess">
  <HintPath>include\$(Platform)\BaseDataAccess.dll</HintPath>
</Reference>
<Reference Include="BaseError">
  <HintPath>include\$(Platform)\BaseError.dll</HintPath>
</Reference>
<Reference Include="BaseTof">
  <HintPath>include\$(Platform)\BaseTof.dll</HintPath>
</Reference>
<Reference Include="MassSpecDataReader">
  <HintPath>include\$(Platform)\MassSpecDataReader.dll</HintPath>
</Reference>
<Reference Include="System" />

关于这个问题的任何想法?我假设我可以执行xcopy命令,但这似乎没有必要,特别是如果它在x64模式下正常工作。

在三台不同的计算机上使用Windows 8和Windows 7 64位进行测试。

1 个答案:

答案 0 :(得分:0)

我在意识到某些.dll文件版本错误后解决了这个问题。我在.dll上使用了ildasm.exe,打开了清单,并意识到某些.dll引用了其他.dll文件的错误版本。所以msbuild没有按预期执行二进制文件的副本。我手动复制丢失的.dll文件时代码工作的原因是API在两个版本之间没有变化。