调用 DLL 函数时遇到问题
Posted
技术标签:
【中文标题】调用 DLL 函数时遇到问题【英文标题】:Trouble calling DLL function 【发布时间】:2019-04-09 08:59:41 【问题描述】:我购买了一个打印机设备,它提供了一个包含该功能的 DLL,并且需要从我的 C# 代码调用该 DLL 中的 C++ 函数。但是,当我尝试这样做时,我总是会遇到错误。使用应用程序提供的相同代码也可以正常工作。以下是我的代码的一部分:
[DllImport("Msprintsdk.dll", EntryPoint = "SetInit", CharSet = CharSet.Ansi)]
public static extern unsafe int SetInit();
然后像这样调用上面的函数:
var res = SetPrintport(new StringBuilder("USB001"),0);
if (res == 0)
Console.WriteLine("Printer Setup Successful.");
else
Console.WriteLine("Printer Setup Un-Successful.");
Console.ReadKey();
Environment.Exit(0);
【问题讨论】:
你得到什么错误? 确保所有 C++ 库和 dll 都在 bin 文件夹中。 您是否将 DLL 放在您的 bin/Debug 文件夹中?如果没有,请把它放在那里。 您是否尝试从 64 位 EXE 调用 32 位 DLL(反之亦然)? 【参考方案1】:您在使用 C++ dll 时可能遇到的所有问题如下所列:
首先,请确保将 DLL 放在 \bin\Debug 文件夹中。
接下来确定 DLL 是 x86 还是 x64。如果是 x86 DLL,您需要在 VS 中勾选 Prefer 32-bit 选项。
它会是什么样子:
应该是什么样子(注意现在检查了 Prefer 32-bit):
最后但并非最不重要的一点是,您必须检查您正在使用的 .NET 框架。 如果使用 .NET 3.5,您的代码应该类似于:
[DllImport("Msprintsdk.dll", EntryPoint = "SetInit", CharSet = CharSet.Ansi)]
public static extern unsafe int SetInit();
var res = SetPrintport(new StringBuilder("USB001"),0);
if (res == 0)
Console.WriteLine("Printer Setup Successful.");
else
Console.WriteLine("Printer Setup Un-Successful.");
Console.ReadKey();
Environment.Exit(0);
如果使用 .NET 4 或更高版本,您的代码应如下所示:
[DllImport("Msprintsdk.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SetInit", CharSet = CharSet.Ansi)]
public static extern unsafe int SetInit();
var res = SetPrintport(new StringBuilder("USB001"),0);
if (res == 0)
Console.WriteLine("Printer Setup Successful.");
else
Console.WriteLine("Printer Setup Un-Successful.");
Console.ReadKey();
Environment.Exit(0);
注意添加的CallingConvention = CallingConvention.Cdecl
。
在我看来,这些是任何人在开始使用 C++ dll 时都会遇到的最常见问题。
使用您提供的代码来演示示例,因为我懒得写自己的:)。 希望这可能对您的情况有所帮助。
【讨论】:
以上是关于调用 DLL 函数时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
Memory AccessViolationException 错误从 C# 调用 DLL