【问题标题】:Can i use unmanaged DLL without its pdb file? C#我可以在没有 pdb 文件的情况下使用非托管 DLL 吗? C#
【发布时间】:2014-09-28 21:28:55
【问题描述】:

我在 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 文件吗?

【问题讨论】:

  • 一个pdb仅用于调试。
  • 您需要添加对dll的引用,pdb仅用于调试目的。

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


【解决方案1】:

您不需要 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 了解更多信息。

【讨论】:

  • 我试过了,但是这个方法没有返回任何值
  • 预期的返回类型是什么?如果 p/invoke 代码认为它是一个错误指示符,您可能需要在 DllImport 属性上设置 PreserveSignature 字段...
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2012-03-18
  • 2012-02-13
相关资源
最近更新 更多