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#程序中使用模板方法?
C++编译器不会将模板函数烧录到二进制文件中.只发出专门版本.C++编译器在逻辑上克隆模板定义,并替换T
为所需的具体类型.
这意味着您必须创建一个专门的包装器:
void __declspec(dllexport) SwapMe(int *fisrt, int *second) { //example
{ SwapMe(first, second); }
Run Code Online (Sandbox Code Playgroud)
你可以用C#调用这个,但你不能调用模板版本.
C++模板和C#泛型的工作方式截然不同.