从dll导出具有clr参数的函数?

时间:2010-12-28 13:32:07

标签: dll managed-c++ dllexport

我有一个遗留的托管c ++ dll,我需要调用一些返回托管类型的函数。

对于没有托管类型的dllexports,这很容易,我只是在这样的标题中定义我的静态c(++)函数:

extern "C" 
{
  __declspec(dllexport)  int  __cdecl  InitSystem();
}

但是现在静态c(++)函数应该返回一个托管类型,这里我遇到了问题。如果我尝试(例如):

extern "C" 
{
  __declspec(dllexport)  System::Collections::Generic::List<System::String^>^  __cdecl  InitSystem();
}

我遇到编译错误(函数定义需要__clrcall签名)。

由于DLL不是程序集(我认为),我有点不知道如何使用.net / clr参数导出一个简单的函数调用。这可能很简单,我只是看错了方向?

1 个答案:

答案 0 :(得分:2)

它必须是一个程序集,没有其他方法可以使用类似托管类型构建代码。在一个程序集中混合托管代码和本机代码很好。这自动解决了问题,该功能将在元数据中可用,无需导出。您需要删除所有装饰,它不能应用于托管方法。它应该在ref类中,以允许其他托管语言使用它。

public ref class Mumble {
public:
    static System::Collections::Generic::List<System::String^>^  InitSystem();
};

C#程序现在可以使用var lst = Mumble.InitSystem()。建议使用命名空间。

注意/ clr btw,它可以轻松地将本机代码转换为IL而无需投诉。关闭/ clr源代码文件或使用#pragma managed。