【问题标题】:Where should I put an unmanaged dll dependency?我应该在哪里放置非托管 dll 依赖项?
【发布时间】:2011-09-15 14:58:17
【问题描述】:

我有一个包含两个项目的 Visual Studio 解决方案:

  • 一个类库MyLib

    • MyLib 引用 MyAssembly.dll
    • MyAssembly.dll 依赖于 mynativedll.dll,它不是 .Net 程序集,而是本机 dll。
  • 一个网络项目MyWeb

    • MyWeb 参考MyAssembly.dll

在web项目中,我应该把mynativedll.dll放在哪里?

如果我把这个dll放在bin目录下,清理的时候这个dll就作废了。

如果我将这个 dll 放在“Lib”文件夹中的 MyAssembly.dll 旁边,并在该文件夹中添加一个探测路径,这将不起作用。实际上,MyAssembly.dll 被复制到 bin 目录(作为参考),即使我将“复制到本地”设置为 true。

处理此类情况的正确方法是什么?

【问题讨论】:

  • mynativedll.dll 是 COM DLL 吗?

标签: asp.net dependencies


【解决方案1】:

哦……事实上。

我在 web 项目中直接引用了MyAssembly.dll(即使从代码的角度来看我也不需要)。 然后我在web目录中将“Copy local”设置为false。

这样就解决了问题。

MyAssembly.dll 没有复制到 bin 文件夹,而是从原生 dll 所在的 lib 文件夹中复制出来。

【讨论】:

  • 我不确定这是否能解决您的问题。我敢打赌,如果您查看 /bin 文件夹,您会看到两个 .dll 文件的旧副本。正确答案是把它们都放在/bin
  • @Eric:不... bin 不是手动放置 dll 的好地方。但你是对的,我必须清理 bin 文件夹才能正常工作。
  • @James Johnson:我还要等两天
  • 您可以使用项目引用。在需要非托管dll的项目中,您可以将其添加到项目中,但将属性的窗口构建操作设置为Content。然后被其他项目引用时会自动复制。
【解决方案2】:

您没有使用 DllImport 属性在外部实现本机库的方法的任何原因?:

[DllImport("advapi32.dll")]
private static extern int LogonUserA(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);

DllImport 属性:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

外部修饰符:
http://msdn.microsoft.com/en-us/library/e59b22c5%28v=vs.80%29.aspx

【讨论】:

  • MyAssembly.dll 和 MyNativeLibrary.dll 都是第 3 方...我的问题不是 dll 是如何工作的,而是找到了 dll
  • 本机DLL是操作系统提供的吗?
  • 当然不是!如果是这样就没有问题了