Delphi调用非托管DLL能够正常工作,但C#无法。

3

我希望你能帮助我翻译一些关于IT技术的内容。以下是需要翻译的内容:

我看到了一些关于我的问题的主题,但它们并没有很清楚地帮助我。

我的问题是:我有一个调用外部dll的Delphi 7应用程序,这个dll来自第三方(我无法访问源代码)。我正在尝试将Delphi代码转换为C#(.NET 2.0)。

以下是调用dll的Delphi代码:

function C500pchar(Comando : pchar):Integer; stdcall; external 'c50032.dll' name 'C500';

这是我的C#代码,用于调用相同的dll:

[DllImport("C50032.DLL", CallingConvention = CallingConvention.StdCall, EntryPoint = "C500")]
    static extern int C500pchar(StringBuilder Comando);

这段C#代码在我从Visual Studio 2005运行它时正常工作,但当我尝试运行exe文件时,应用程序调用Method C500pchar时会崩溃。我尝试复制Release和Debug文件夹中的所有文件,甚至从文件夹运行exe,但只有在我从VS运行时才有效。

我做错了什么吗?

编辑:我正在Windows 7上工作并遇到此问题。但我已经尝试在Windows XP SP3上运行,并且正常工作。


StringBuilder真的是正确的类型吗?你确定你不想要一个普通的String吗?(而且你的DLL接受宽字符串还是窄字符串?我不太熟悉Delphi,无法从签名中读取。) - Rup
1
你能展示调用该函数的代码吗? - David Heffernan
请问您能否展示调用这些函数的代码? - David Heffernan
私有整数 c500(ref StringBuilder Comando) { 整数结果 = C500pchar(Comando); 返回结果; } - Renan Vasconcelos
我想看一下创建 StringBuilder 的代码。另外,Delphi 代码是做什么的?你怎么知道在 StringBuilder 中分配多大的缓冲区?C500pchar 到底是做什么的?它是否将文本复制到传递给它的缓冲区中?有多少文本?返回值是什么?如果能够看到调用 DLL 的 Delphi 代码和完整的 C# 调用代码,那么我肯定可以找到错误。请将此作为问题的编辑。 - David Heffernan
1个回答

3

您的项目在Visual Studio中以32位模式运行,但在直接运行时以64位模式运行。您必须更改项目设置,使其以x86而不是任何CPU模式运行。


@DavidHeffernan:我错过了什么? - oɔɯǝɹ
如果一个非托管模块无法在x64进程中加载,那么你不应该编译为AnyCPU。所以他的建议没有任何问题。 - Claus Jørgensen
如果目标是 AnyCPU(不应该是,应该是 x86),那么无论是从 Visual Studio 运行还是独立运行,都会启动 64 位进程。答案暗示了行为取决于进程是否从 VS 运行,这是不正确的。 - David Heffernan
@RenanVasconcelos:啊,好的。也许结合使用Marshalling和位数? - oɔɯǝɹ
顺便说一下,您可以使用此答案中的代码片段来检测 .net 应用程序的位数。 - oɔɯǝɹ
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接