如何从 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中的资源文件,如 xml文件