如何从C#代码中调用具有int *类型参数的C ++ DLL中定义的函数?

时间:2011-02-03 14:58:56

标签: c# c++-cli

我有一个原生的常规C ++ Dll,我想从C#代码调用,所以我创建了C ++ / CLI类(如herehere所述),其中包括托管C ++代码,哪些可以由任何C#代码直接调用,并且可以调用本机非托管C ++。

本机C ++ dll中的一个函数具有int *类型的参数。如何在包装函数中声明,如何将其转换为int *?

2 个答案:

答案 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);