【问题标题】:export function with clr parameters from dll?从 dll 导出带有 clr 参数的函数?
【发布时间】:2010-12-28 13:32:06
【问题描述】:

我有一个旧的托管 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 参数导出简单的函数调用。这可能很简单,我只是在寻找错误的方向?

【问题讨论】:

    标签: dll managed-c++ dllexport


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2012-09-06
      • 2021-09-17
      • 2012-12-26
      相关资源
      最近更新 更多