我有一个原生的常规C ++ Dll,我想从C#代码调用,所以我创建了C ++ / CLI类(如here和here所述),其中包括托管C ++代码,哪些可以由任何C#代码直接调用,并且可以调用本机非托管C ++。
本机C ++ dll中的一个函数具有int *类型的参数。如何在包装函数中声明,如何将其转换为int *?
答案 0 :(得分:5)
这是通过引用传递值的C / C ++方式。您应该使用 ref 或 out 关键字:
[DllImport("something.dll")]
private static extern void Foo(ref int arg);
在C ++ / CLI中看起来大致如下:
public ref class Wrapper {
private:
Unmanaged* impl;
public:
void Foo(int% arg) { impl->Foo(&arg); }
// etc..
};
答案 1 :(得分:2)
[DllImport("some.dll")]
static extern void SomeCPlusPlusFunction(IntPtr arg);
IntPtr是一种大致相当于void *的类型。
从你的评论中,你最好做这样的事情(C#):
int size = 3;
fixed (int *p = &size) {
IntPtr data = Marshal.AllocHGlobal(new IntPtr(p));
// do some work with data
Marshal.FreeHGlobal(data); // have to free it
}
但是由于AllocHGlobal可以采用int,我不知道你为什么不这样做:
IntPtr data = Marshal.AllocHGlobal(size);