如何从 C# 中的子文件夹导入 .dll 库

Posted

技术标签:

【中文标题】如何从 C# 中的子文件夹导入 .dll 库【英文标题】:How do I import .dll library from subfolder in C# 【发布时间】:2014-12-07 03:51:45 【问题描述】:

当我将库与应用程序放在同一文件夹中时,我可以简单地:

[DllImport("kernel32")]
public extern static IntPtr LoadLibrary(string librayName);

IntPtr iq_dll = LoadLibrary("IQPokyd.dll");

我的 app.config 中也有这个

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="plugins;" />
    </assemblyBinding>
  </runtime>
</configuration>

我可以加载这个库。问题是它正在使用一些需要在应用程序运行目录中的配置文件。是否有可能告诉库它需要的文件与库位于同一文件夹中?

【问题讨论】:

IQPokyd.dll 是 .NET 程序集吗?还是原生DLL? 我认为这是用 C++ 制作的第 3 方 dll。所以我需要这样导入。 我已经重写了问题。 在这种情况下,带有完整路径的LoadLibrary 应该会有所帮助。我知道你试过了。如果是这样,我相信错误在其他地方。 当我尝试使用相对或绝对路径时,程序甚至无法启动它会引发致命错误。但是只有库的名称它会通过并且在方法调用之后会出现错误。如果不在插件文件夹中,一切正常。 【参考方案1】:

由于 DLL 在当前目录中搜索配置,因此在加载之前临时更改当前目录是有意义的:

string saveCurDir = Directory.GetCurrentDirectory();
Directory.SetCurrentDirectory(Path.Combine(Application.StartupPath, "plugins"));

IntPtr iq_dll = LoadLibrary("IQPokyd.dll");

Directory.SetCurrentDirectory(saveCurDir);

【讨论】:

【参考方案2】:

您可以通过在应用的 .config 文件中添加探测标记来实现此目的。 例如,如果您希望从 /lib/ 子目录加载库,您的配置将如下所示:

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="lib"/>
    </assemblyBinding>
  </runtime>
</configuration>

【讨论】:

我已经重写了问题。

以上是关于如何从 C# 中的子文件夹导入 .dll 库的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 方法,如何调用和运行 DLL,其中 DLL 名称来自 String 变量?

C#编组来自C++ DLL的无符号字符返回值[重复]

如何从 C# 导入和使用非托管 C++ 类?

C#项目中如何调用C#写的dll中的资源文件,如 xml文件

如何从 C# 中的 C++ dll 中的全局变量从函数中获取返回数组?

如何从 Java 中的 C# dll 调用函数?