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



我有一个旧的本地MFC/c++ dll,我已经设法让它与/CLR标志编译。现在我已经在命名空间内的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并添加了一个托管的c++类(与上面相同的类)。使用/CLR标志编译。

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

System.BadImageFormatException。有线索吗?

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

System.BadImageFormatException通常是由AnyCPU . net应用程序引用包含32位本机代码的DLL引起的。在64位平台上运行时会出现错误,因为AnyCPU应用程序以64位运行,并且无法加载DLL。解决这个问题的方法是(简单)将应用程序标记为仅支持x86,或者(困难)提供包含本机代码的所有dll的32位和64位版本。

当然,你可能有其他问题。检查你的DLL与红门反射器的建议@cdleonard在评论是一个伟大的下一步。或者ILSpy,它是免费的

最新更新