无法调用DLL函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法调用DLL函数相关的知识,希望对你有一定的参考价值。

我买了一个打印机设备,它提供了一个包含该功能的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时可能遇到的所有问题如下所示:

首先确保将DLL放在 bin Debug文件夹中。

接下来确定DLL是x86还是x64。如果是x86 DLL,则需要在VS中选中标记Prefer 32位选项。

它会是什么样子:enter image description here

它应该是什么样的(注意现在检查Prefer 32位):

enter image description here

最后但并非最不重要的是,您必须检查您正在使用的.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函数的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 调用 C++ dll 函数时出现问题

C# 调用需要双精度数组和结构作为输入的 C++ DLL 函数

如何从片段 KOTLIN 中调用意图 [重复]

无法找到指定dll库文件skinH_EL.dll中的输出命令skinH_Attach_EX_

C#调用DLL问题

asm:调用 DLL