使用/ CLR标志构建的本机dll包含托管类

时间:2011-10-13 04:36:45

标签: c++ clr managed

我有一个旧的本机MFC / c ++ dll我已经设法用/ CLR标志编译它。 现在我在namaspace中向dll添加了一个托管C ++ / CLI类。

头文件位于下方,cpp文件只有头文件的#include。 本机dll是一个包含大量非托管代码的巨大dll项目,但它只有一个托管c ++类,如下所示。

当我添加该dll作为.net winforms项目的引用时,我在对象浏览器中看不到该命名空间/类

我因为没有找到命名空间“ShashiTest”而得到编译错误

我正在使用Visual Studio 2008。

混合模式下的原生dll无法作为对托管项目的引用添加?

或者我错过了什么

请帮忙。

#pragma once
#using<mscorlib.dll>
#using<system.windows.forms.dll>
// Class derived from Forms

using namespace System::Windows::Forms;
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Diagnostics;
using namespace System::Windows::Forms;

namespace ShashiTest {
/// <summary>
/// Summary for test
/// </summary>
   public ref class test
  { 
   public:
    test(void)
    {

    };
    void ShowMessage()
    {
        MessageBox::Show("Hello World");
    }
  };
}

当我简化我的问题时......我创建了一个新的MFC dll并为其添加了一个manged C ++类(与上面相同的类)。用/ CLR标志编译。

当我将此dll添加到winforms项目并运行它时,我得到了

System.BadImageFormatException。任何线索?

但是我看到类和名称空间和winform项目编译得很好,不像我上面的问题。

1 个答案:

答案 0 :(得分:1)

System.BadImageFormatException通常是由AnyCPU .NET应用程序引用包含32位本机代码的DLL引起的。在64位平台上运行时出现错误,因为AnyCPU应用程序以64位运行,无法加载DLL。对此的修复是(简单)将应用程序标记为仅x86或(硬)以提供包含本机代码的所有DLL的32位和64位版本。

当然,你可能还有其他一些问题。按照@cdleonard在评论中的建议,使用Red Gate Reflector检查DLL是一个很好的下一步。或ILSpy,这是免费的。