3

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

对于没有托管类型的 dllexport,这很容易,我只需在如下标头中定义我的静态 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 参数导出简单的函数调用。这可能很简单,我只是在寻找错误的方向?

4

1 回答 1

2

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

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

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

注意 /clr 顺便说一句,它将很容易地将本机代码转换为 IL,而不会产生任何抱怨。关闭源代码文件上的 /clr 或使用 #pragma managed。

于 2010-12-28T14:17:04.830 回答