调用 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 函数时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

从 Dll 调用具有偏移地址的成员函数

使用 DLL 函数时的访问冲突异常

Memory AccessViolationException 错误从 C# 调用 DLL

动态调用dll遇到的问题

从 DLL 链接到 OpenGL:运行时 glew 函数为空

从 dll 调用函数时分配大小无效