【发布时间】:2014-11-21 23:00:29
【问题描述】:
我正在开发一个 C++ DLL,它应该能够接收一些参数并将其传递回 C# 应用程序。
我能够做到这一点,效果很好。至少我是这么认为的。该代码在我的电脑上运行良好,但在我同事的电脑上却不行。在他的 PC 上,相同的代码(在我的 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 会大于缓冲区大小,但我不知道它到底有多大?(我只会在 DLL 中知道它)
有谁知道为什么相同的代码在不同的 PC 上表现不同?
提前致谢!
【问题讨论】:
-
是否允许将 C# 中声明的字符串直接转换为 char* 隐式?有一次,我使用 C++/CLI 为原生 C++ 类编写了包装器(遵循本教程:codeguru.com/cpp/cpp/cpp_managed/interop/article.php/c6867/…),我必须非常小心地在原生 C++ 端和 C++/CLI 托管端之间编组类型。
-
@Ian 是的,你可以。这是 P/Invoke 层的一部分。
-
这段代码看起来没什么问题。可能您应该在其他地方寻找问题。顺便说一句,您可以省略调用约定 - stdcall 是默认值。
-
@Nikolay:不,我不能。如果我省略它,代码将不起作用。我在某处读到 C# 的默认调用约定是 cdecl,而不是 stdcall。
-
顺便说一句,“bool”也是正确的,它默认编组为 Int32,即“BOOL”。即我敢打赌,问题不在于您发布的代码。
标签: c# c++ visual-studio pinvoke