我在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);
但该方法不会返回任何值。 在输出列表中有:
'CCan.exe'(Win32):已加载'C:\ Users \ Masbro \ Documents \ Visual Studio 2013 \ Projects \ CCan \ CCan \ bin \ x86 \ Debug \ unmanaged.dll'。无法找到或打开PDB文件。
我可以在没有pdb文件的情况下使用非托管DLL吗?或者我可以生成其.pdb文件吗?
答案 0 :(得分:3)
您不需要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);
可见性修饰符(公共)并不重要,只是您需要能够从您调用它的任何位置查看该功能。 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);
请查看the MSDN documentation了解详情。