我正在研究一個C++ DLL,它應該能夠接收並將一些參數傳遞迴C#應用程序。從C#傳遞參數到C++ Dll並返回的正確方法是什麼?
我能夠做到這一點,這是工作正常。至少我是這麼想的。代碼在我的電腦上工作正常,但不在我的同事的個人電腦上。在他的PC上,相同的代碼(在我的電腦上運行時沒有錯誤)會產生不同的輸出,或產生錯誤。基本上它表現得很怪異。
C++函數:
extern "C"
{
__declspec(dllexport) BOOL __stdcall MyFunction(char * StringIn, char *StringOut, BOOL bState);
}
我用這種方式在C#:
[DllImport(@"PathToMyDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool MyFunction(string StringToDLL, StringBuilder StringFromDLL, bool bState);
static void Main(string[] args)
{
int bufferSize = 16384;
string StringToDLL = "This is a sample string";
StringBuilder StringFromDLL = new StringBuilder(bufferSize);
Console.WriteLine("Return value = " + MyFunction(StringToDLL, StringFromDLL, true).ToString());
Console.WriteLine("Sent to DLL = " + StringToDLL.ToString());
Console.WriteLine("Returned from DLL = " + StringFromDLL.ToString());
Console.ReadLine();
}
所以我的問題是:
我做錯什麼了嗎?還是有一些Visual Studio中的設置可能導致這種行爲?另外,我應該如何正確地爲C#中的StringOut分配內存?有一種情況可能出現在StringOut會比buffersize大的地方,但我不知道它到底有多大?(我只知道它在DLL裏面) 有沒有人有任何想法爲什麼相同的代碼會自動運行不同地在不同的PC上?
在此先感謝!
您允許將C#中聲明的字符串直接轉換爲char *隱式嗎?有一次,我使用C++/CLI爲本地C++類編寫了包裝器(請參閱本教程:http://www.codeguru.com/cpp/cpp/cpp_managed/interop/article.php/c6867/Consuming-Unmanaged-C-Class -Libraries-from-Net-Clients.htm),我必須非常小心編譯本機C++端和C++/CLI管理端之間的類型。 – Ian 2014-11-21 23:08:03
@Ian是的,你可以。這是P/Invoke層的一部分。 – cdhowie 2014-11-21 23:14:18
看起來這個代碼沒有問題。可能你應該在其他地方尋找問題。順便說一句,你可以省略調用約定--stdcall是默認的。 – Nikolay 2014-11-21 23:14:36