我可以使用无pdb文件的非托管DLL吗?c#

本文关键字:DLL 可以使 pdb 文件 我可以 | 更新日期: 2023-09-27 18:16:46

我在c#中有一个项目,使用来自另一个项目的非托管dll,我尝试导入该dll文件,但我不能使用该dll文件,因为Visual Studio找不到它的.pdb文件,我也没有。

我已经尝试导入DLL

[DllImport("unmanaged.dll", EntryPoint= "Analyse", CallingConvention = CallingConvention.Cdecl)]
        private static extern unsafe long* Analyse(byte[] bImgData, uint nLength, ushort nWidth, ushort nHeigth, uint nMaxCodeCount, short nAnalyseLevel);

但是该方法不返回任何值。在输出列表中有:

' cccan .exe' (Win32): Loaded 'C:'Users'Masbro'Documents'Visual Studio 2013'Projects'CCan'CCan'bin'x86'Debug'unmanaged.dll'。无法找到或打开PDB文件。

我可以使用无pdb文件的非托管DLL吗?或者我可以生成它的.pdb文件吗?

我可以使用无pdb文件的非托管DLL吗?c#

您不需要PDB。然而,你确实需要知道你在DLL中调用的API的入口点和函数签名;Visual Studio不会帮你解决这些问题。但是,如果DLL导出其函数名,则可以使用各种工具找到它们。这里有一些例子,在MSDN上:http://msdn.microsoft.com/en-us/library/vstudio/31d242h4(v=vs.100).aspx

例如,假设您的库unmanaged.dll具有以下API:

void* DoStuff (DWORD number, LPWSTR str, PDWORD outval);
要从c#代码中调用它,您需要在您的一个类中定义以下extern函数:
using System.Runtime.InteropServices
[DllImport("unmanaged.dll", CharSet=Unicode)]
public static extern IntPtr DoStuff (UInt32 number, String str, out UInt32 outval);

可见性修饰符(public)并不重要,除了需要能够从调用函数的任何地方看到它。DllImport属性是在System.Runtime.InteropServices中定义的,因此是using语句。

DllImport需要第一个值,即给出DLL名称的字符串,但它也有大量其他参数,有时是有用的,甚至是必需的(如CharSet)。特别是,如果您的非托管库不导出名称(或者您希望在c#中使用与导出的非托管名称不同的名称),则需要指定DllImport属性的EntryPoint字段。如果您知道函数的序数,则在没有导出名称的情况下访问函数的示例:

[DllImport("unmanaged.dll", CharSet=Unicode, EntryPoint="#1")]
public static extern IntPtr DoStuff (UInt32 number, String str, out UInt32 outval);

查看MSDN文档获取更多信息

相关文章: