我正在研究一个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