我有一個原生的常規C++ Dll,我想從C#代碼調用,因此我創建了C++/CLI類(如here和here),它將包含託管C++代碼,並且可以由任何C#代碼直接調用,可以調用本機非託管C++。如何在C#代碼中調用C++ DLL中定義的函數,該函數的參數類型爲int *?
原生C++ dll中的一個函數具有int *類型的參數。如何在包裝函數中聲明,以及如何將其轉換爲int *?
我有一個原生的常規C++ Dll,我想從C#代碼調用,因此我創建了C++/CLI類(如here和here),它將包含託管C++代碼,並且可以由任何C#代碼直接調用,可以調用本機非託管C++。如何在C#代碼中調用C++ DLL中定義的函數,該函數的參數類型爲int *?
原生C++ dll中的一個函數具有int *類型的參數。如何在包裝函數中聲明,以及如何將其轉換爲int *?
[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);
它是通過引用傳遞值的C/C++方式。您應該使用裁判或出關鍵字:
[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..
};
然後使用`ToPointer()`方法來獲得`void *`指針,然後可以將其轉換爲`int *`並取消引用。 – 2011-02-03 15:26:31
嗨夥計,感謝您的回覆,我使用以下代碼段進行基於您的答覆的指針轉換。請告訴我,如果我錯了。 Apolozose任何愚蠢的錯誤,即時通訊新手在C#和C++/CLI編程。 int b = 3; IntPtr errno = new IntPtr(&b); int * var =(int *)Marshal :: AllocHGlobal(errno).ToPointer(); – Ashutosh 2011-02-04 12:11:58