我有一个旧的本地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,它是免费的