使用包含托管类的 /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的主要内容,如果未能解决你的问题,请参考以下文章