P /从C#调用C++模板<T>方法

Sec*_*ret 7 c# c++ generics pinvoke templates

我在C++函数中定义了外部调用:

template<typename T>
void __declspec(dllexport) SwapMe(T *fisrt, T *second)
{
    std::cout << typeid(T).name() << std::endl;

    T temp = *first;
    *first = *second;
    *second = temp;
}
Run Code Online (Sandbox Code Playgroud)

我想在C#程序中使用它.我试过这样的方式:

unsafe class Program
{
    [DllImport("lib1.dll", EntryPoint = "SwapMe")]
    static extern void SwapMe<T>(T first, T second);

    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到了这样的错误:

泛型类中的通用方法或方法是内部调用,PInvoke,或者在COM Import类中定义.

似乎是,C#中的Generic是托管类型,而且在C++中使用非托管模板的架构是相当不同的东西.

如何在我的C#程序中使用模板方法?

usr*_*usr 8

C++编译器不会将模板函数烧录到二进制文件中.只发出专门版本.C++编译器在逻辑上克隆模板定义,并替换T为所需的具体类型.

这意味着您必须创建一个专门的包装器:

void __declspec(dllexport) SwapMe(int *fisrt, int *second) { //example
{ SwapMe(first, second); }
Run Code Online (Sandbox Code Playgroud)

你可以用C#调用这个,但你不能调用模板版本.

C++模板和C#泛型的工作方式截然不同.