【问题标题】:Unable to load dll无法加载dll
【发布时间】:2012-01-12 13:23:43
【问题描述】:

我正在尝试使用 DllImport 加载 dll,如果我指定了 dll 的路径,它可以正常工作,但是,如果我没有指定 dll 的路径,并且只输入“foo.dll”,它会抱怨“无法加载 dll”,即使我已经将 dll 文件放入 bin 文件夹。

我以为如果我不指定dll路径,它会假设它会在与exe文件相同的文件夹中启动dll,但似乎不是这样。

有什么建议吗?

谢谢

【问题讨论】:

  • “我已将dll文件放入bin文件夹”是什么意思?你的意思是bin/Debug?您是否在 Visual Studio 中以调试模式运行?
  • @PlayKid,这可能是依赖问题。您可以使用Dependency Walker 之类的工具来检查是否一切都得到了正确解决。
  • Webste 或普通应用程序= 文件不同。什么语言?来吧,在这里给我们提供基线信息。我们看不到你的肩膀。
  • 嗨,马克,你是对的,bin/Debug 或 bin/Release,我都有那个 dll。
  • 嗨 TomTom,它是 Visual Studio 中的 C#。

标签: c# dll path dllimport


【解决方案1】:

如果您不想使用路径,您可以始终将 dll 放在 Windows GAC (wiki link) 中。这样做可能会很痛苦,因为有时您需要对 dll 进行签名,但这意味着可以在没有路径的情况下访问 in。

【讨论】:

  • 您无法将本机 *.dll 添加到 GAC。
  • @WiktorZychla 如果您所说的本机 dll 是指由用户(不是我的微软)创建的,则可以。这就是你用来为 sharepoint 创建 webpart 的方式 - msdn.microsoft.com/en-us/library/dkkx7f79.aspx
  • 不。 “本机 dll”是一个 win32 的。只有这些由 DllImport 加载。
  • @WiktorZychla 抱歉从不同的角度看待原生,即应用程序原生等。我的错:)。本机 dll 存储在不需要路径(如果我没记错的话)的 system32 文件夹中,因此 OP 不能谈论本机 dll,它必须是用户制作的(或第 3 方制作的),在这种情况下添加到GAC 是可行的。
  • 再次不 :) 原生 DLL 可以轻松地用 C/C++ 编码,并且可以存储在操作系统的任何位置。您使用 LoadLibrary 加载它们,这就是 .NET PInvoke 使用它们的方式。您不能将它们存储在 GAC 中。
【解决方案2】:

您尝试加载的 DLL 很可能依赖于其他资源。您可以通过首先在远程路径上调用 Win32 的 LoadLibrary 来欺骗 DllImportDllImport 会注意到库已经加载到内存中,它应该可以正常工作。

代码sn-p:

    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("yourlibrary.dll")]
    public static extern void Foo();

    public void CallTheFooMethod()
    {
       // first load the library
       LoadLibrary( "C:/..........full path/yourlibrary.dll" );

       Foo();  
    }

【讨论】:

  • “程序无法启动,因为您的计算机中缺少 log4cxx.dll。请尝试重新安装程序以解决此问题。”
  • 易于修复。您的本机库似乎使用 log4cxx 作为日志记录子系统。尝试复制本地库旁边的库。
【解决方案3】:

在您的 C++ dll 项目中打开项目属性,导航到 C/C++ -> 代码生成。然后为运行时库设置多线程调试 (/MTd) 用于调试配置和多线程 (/MT) 用于发布。之后,您可以将编译后的 dll 放入输出目录并检查它是否有效。随时发表评论和提问。

UPD:

这里是link to the simple little project,它使用本机代码测量当前 CPU 频率,DllImport'ed 到 C# 项目代码。

构建步骤: 1. 以任何配置构建 C++ 项目(实际上在此示例中使用什么配置并不重要)。 2.在配置输出文件夹中找到编译好的dll(Debug|Release) 3. 将找到的 dll 添加到 C# 项目的 ExternalLibraries 文件夹中,在文件 Properties 中将操作设置为 Copy If Newest(右键单击 lib -> Properties)。 4. 构建并运行 C# 项目 -> 利润。

为什么我向您推荐这个:我的客户要求提供一个可以测量 CPU 频率的代码,我已经在我的机器上很好地运行了这个代码,但客户没有。它依赖于 MS VC 运行时库。在为 Debug 配置设置多线程调试 (/MTd) 和为 Release 设置多线程 (/MT) 之后,所有依赖项的代码都嵌入到您的二进制文件中,因此您已经可以解决至少一个依赖源。

【讨论】:

  • 嗨 Eugene,感谢您的项目,但是,这似乎是依赖问题,我不能只加载 dll,而是将 dll 加载到其安装的文件夹中以确保加载所有依赖项也是。所以现在我需要某种机制来在运行时或在配置文件中分配路径,但我遇到了挑战。
  • 是自己的dll还是第三方的?您能否提供该 dll 的链接或项目?
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多