可能重复:
如何在另一个目录中分离托管和非托管 DLL
我将非托管代码与我的 C# 托管代码一起使用。我在应用程序的可执行文件中嵌入了非托管 DLL。为了完成这项工作,我在调用 DLL 方法之前将资源/DLL 提取到一个文件中。
public static class ResourceExtractor
{
public static void ExtractResourceToFile(string resourceName, string filename)
{
if (!System.IO.File.Exists(filename))
using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
{
byte[] b = new byte[s.Length];
s.Read(b, 0, b.Length);
fs.Write(b, 0, b.Length);
}
}
}
因此,在调用 DLL 之前,我确保执行以下操作:
ResourceExtractor.ExtractResourceToFile("Namespace.dll_name.dll", "dll_name.dll");
并包装我拥有的非托管 DLL 的方法...
public class DLLWrapper
{
public const string dllPath = "dll_name.dll";
[DllImport(dllPath)]
public static extern uint functionA();
[DllImport(dllPath)]
public static extern uint functionB();
[DllImport(dllPath)]
public static extern uint functionC();
}
现在的问题...
这一切都有效。我不喜欢的是它创建了位于可执行文件旁边的 DLL。我宁愿在临时目录中创建 DLL 并从那里加载它。就像是...
string tempDLLname = Path.GetTempFileName();
ResourceExtractor.ExtractResourceToFile("Namespace.dll_name.dll", tempDLLname );
DLLWrapper.dllPath = tempDLLname;
...
public class DLLWrapper
{
public static string dllPath;
[DllImport(dllPath)]
public static extern uint functionA();
[DllImport(dllPath)]
public static extern uint functionB();
[DllImport(dllPath)]
public static extern uint functionC();
}
但是,这不起作用,因为[DllImport(path)]
需要路径是const
. 那么如何更改要从中加载 DLL 的位置呢?直到运行时我才知道。