我可以在没有pdb文件的情况下使用非托管DLL吗? C#

时间:2014-08-06 04:00:47

标签: c# visual-studio dll project pdb-files

我在c#中有一个使用来自另一个项目的非托管的项目,我尝试导入该文件,但我不能使用该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文件吗?

1 个答案:

答案 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了解详情。