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

Posted

技术标签:

【中文标题】使用包含托管类的 /CLR 标志构建的本机 dll【英文标题】:Native dll built with /CLR flag containing a managed class 【发布时间】:2011-10-13 04:36:45 【问题描述】:

我有一个旧的本机 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 项目编译得很好,不像我上面遇到的问题。

【问题讨论】:

这应该可以。也许你应该显示一些代码?或者使用反射器来检查你的 dll 的内容。 【参考方案1】:

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

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

【讨论】:

谢谢这是我的问题,我强制我的 .net 应用程序到 x86 并且问题消失了。

以上是关于使用包含托管类的 /CLR 标志构建的本机 dll的主要内容,如果未能解决你的问题,请参考以下文章

托管 C++ dll 的加载程序锁定(regsvr32 R6033 错误)

C++/CLI 为啥对托管不可见

在 C++ /CLR 项目中使用 C++ DLL 库项目

将静态本机库链接到托管 C++ 项目会在

桥接非托管类和托管类

是否在CLR上运行非托管Visual C ++?