无法调用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位选项。
它应该是什么样的(注意现在检查Prefer 32位):
最后但并非最不重要的是,您必须检查您正在使用的.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 函数