使用DllImport进行非托管dll的NUnit C#抛出BadImageFormatException

时间:2014-02-10 10:54:45

标签: c# unit-testing nunit unmanaged

我是NUnit的新手(实际上是一般的单元测试),我正在尝试为我正在处理的小事做一些测试。

我正在尝试为libspotify编写一个Wrapper库。

我尝试测试的一个例子是:

    /// <summary>
    /// The connection state of the specified session.
    /// </summary>
    /// <param name="sessionPtr">Pointer to Session object</param>
    /// <returns>The connection state - see the ConnectionStateE enum for possible values</returns>
    [DllImport("libspotify")]
    internal static extern ConnectionStateE sp_session_connectionstate(IntPtr sessionPtr);

    /// <summary>
    /// The connection state of the session
    /// </summary>
    public ConnectionStateE GetConnectionState()
    {
        __CheckIsNotDisposed();
        return sp_session_connectionstate(this.Ptr);
    }

然后是测试本身(在一个单独的项目中,相同的解决方案)

    [Test]
    public void TestSessionInitializeDisconnected()
    {
        using (var sess = new Session())
        {
            Assert.AreEqual(sess.ConnectionState, myLibSpotify.Enums.ConnectionStateE.DISCONNECTED);
        }
    }

不可否认,这项测试可能不是最有用的,但目前这是无关紧要的。我遇到的问题是当我尝试运行测试时,NUnit向我展示了一个例外:

    SpecTests.TestSessionBasics.TestSessionInitializeDisconnected:
    System.BadImageFormatException : An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

我猜这里我忽略了一些东西,但googleing并没有真正帮助,因为我似乎只是为了测试c ++ / cli或其他不太有帮助的结果而找到了结果。

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

解决方法是运行NUnit的32位二进制文​​件而不是64位,这是x64机器上的默认值。

我使用的外部库的原因显然是针对x86(32位)编译的,因此无法很好地处理来自64位环境的代码调用。

正如@HansPassant所提到的,解决方案来自这个问题:nUnit Exception on a 64 bit Machine