C# 任何CPU测试程序集实现x64生产程序集的接口时出现BadImageFormatException

C# 任何CPU测试程序集实现x64生产程序集的接口时出现BadImageFormatException,c#,visual-studio-2010,mstest,64-bit,C#,Visual Studio 2010,Mstest,64 Bit,我似乎遇到了这样一个场景:当我在引用x64程序集的AnyCPU程序集上运行mstest时,我得到了一个BadImageFormatException 当AnyCPUTestingx64Production.dll测试程序集实现x64Production.dll中的接口(即使未使用)时,会出现此问题: 无法加载测试容器“D:\AnyCPUTestingx64Production.dll” 或者它的一个依赖项。错误详细信息: System.BadImageFormatException: 无法加载文

我似乎遇到了这样一个场景:当我在引用x64程序集的AnyCPU程序集上运行mstest时,我得到了一个BadImageFormatException

当AnyCPUTestingx64Production.dll测试程序集实现x64Production.dll中的接口(即使未使用)时,会出现此问题:

无法加载测试容器“D:\AnyCPUTestingx64Production.dll”
或者它的一个依赖项。错误详细信息:
System.BadImageFormatException:
无法加载文件或程序集“x64Production,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。试图加载格式不正确的程序。
  • mstest在64位windows 7上运行
  • 测试程序集构建为AnyCPU,以使其在64位主机上以64位运行(如所述)
  • testsettings文件指定
  • peverify和corflags没有显示任何有趣的内容
  • 这在玩具溶液中很容易重现,即
    • x64生产
      • 不引用其他程序集
      • 仅包括空的公共接口IExampleInterface
      • 已设置为x64
    • AnyCPutestingx64生产
      • 仅引用x64Production.dll(即,即使未引用Microsoft.VisualStudio.QualityTools.UnitTestFramework,也会出现此问题)
      • 仅包括x64Production.IExampleInterface的空实现
      • 已设置为x64
  • nunit可以加载并运行测试程序集(一旦我转换了所有测试属性)
    • 但对于更大的问题(涉及大量项目文件)来说,这不是一个好的短期解决方案
  • 同样的问题也会出现,项目的目标是3.5还是4.0
  • 无论使用VS2008还是VS2010 c#编译器,都会出现同样的问题
  • 无论是使用VS2010的mstest还是使用测试代理,都会出现相同的问题
  • mstest在加载任何CPUTestingx64产品时失败-即,这不是试图在错误的QTAgent中加载程序集的问题(Process Monitor中未显示任何内容,重命名QTAgent32.exe无效):
***装配活页夹日志条目(09/02/2012@09:44:26)***
操作失败。
绑定结果:hr=0x8007000b。试图加载格式不正确的程序。
从以下位置加载的程序集管理器:C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
在可执行文件C:\Program Files(x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe下运行
---下面是详细的错误日志。
==预绑定状态信息===
日志:User=David
日志:DisplayName=x64Production,版本=1.0.0.0,区域性=neutral,PublicKeyToken=null
(详细说明)
日志:Appbase=file:///D:/
日志:初始PrivatePath=NULL
日志:Dynamic Base=NULL
日志:缓存基=NULL
日志:AppName=MSTest.exe
调用程序集:AnyCPUTestingx64Production,版本=1.0.0.0,区域性=neutral,PublicKeyToken=null。
===
日志:此绑定在默认加载上下文中启动。
日志:使用应用程序配置文件:C:\Program Files(x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe.Config
日志:使用主机配置文件:
日志:使用C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config中的计算机配置文件。
日志:此时未将策略应用于引用(私有、自定义、部分或基于位置的程序集绑定)。
日志:正在尝试下载新URLfile:///D:/x64Production.DLL.
日志:程序集下载成功。正在尝试安装文件:D:\x64Production.dll
日志:进入从源代码运行安装阶段。
日志:程序集名称为:x64Production,版本=1.0.0.0,区域性=中性,PublicKeyToken=null
错误:未能完成程序集的设置(hr=0x8007000b)。调查结束了。

是否有其他人确定这在VS2010 mstest中是否不受支持?

通过阅读此内容,mstest.exe为32位。

遵循以下步骤,从VS命令提示符运行(因此CorFlags.exe位于路径中),获得针对我的玩具解决方案运行的测试:

@echo关闭
REM删除32位标志,当在64位操作系统上运行时,强制可执行文件为64位。
REM期望以下输出:
REM“
REM corflags:警告CF011:指定的文件已签名为强名称。使用/Force将使此映像的签名无效,并要求程序集退出。
REM“
CorFlags.exe“C:\Program Files(x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe”/32BIT-/Force
REM跳过强名称验证,因为修改了32位标志
注册添加HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\StrongName\Verification\MSTest,b03f5f7f11d50a3a/f
REM将注册表项复制到64位卷影注册表。
REM如果没有“{13cdc9d9-ddb5-4fa4-a97d-D965CFC6D4B}\Extensions”子键,mstest将输出
REM“
指定的REM文件扩展名“.dll”不是有效的测试扩展名。
REM“
注册副本HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\EnterpriseTools\QualityTools\TestTypes HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\EnterpriseTools\QualityTools\TestTypes/s/f

这将如何与实际的生产代码进行比较还有待观察。

我来这里是为了寻找类似问题的解决方案。发布此答案,以防我找到的解决方案对其他人有所帮助。 这为我在Visual Studio(2012)中解决了这个问题:

添加新项目->测试设置 更改测试设置 默认设置为“强制测试在32位进程中运行”

从菜单中: 测试->测试设置->选择测试设置文件->选择已创建的测试设置文件


现在运行测试。

现在使用Visual Studio 2013(至少在2012年没有尝试过),除了选择Te,我什么都不用做
    [TestMethod]
    public void Running_64Bit_OS()
    {
        // It was determined to run only in 64 bits.
        bool is64BitOS = System.Environment.Is64BitOperatingSystem;
        Assert.AreEqual(is64BitOS, true);
    }

    [TestMethod]
    public void Running_64Bit_Process()
    {
        // We have a requirement that one of the unmanaged DLL is built for 64 bits.
        // If you are running MS Test in Visual Studio 2013 and this
        // is failing, go to Test->Test Settings->Default Processor Architecture and
        // chose x64, then run the tests again.  This is not the only method.  You
        // could also use a test settings file.
        bool is64BitProcess = System.Environment.Is64BitProcess;
        Assert.AreEqual(is64BitProcess, true);
    }