我可以使用无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中调用的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文档获取更多信息