0

可能重复:
如何在另一个目录中分离托管和非托管 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 的位置呢?直到运行时我才知道。

4

1 回答 1

4

在对 dll 调用任何调用之前,您可以显式使用 LoadLibrary 并传入您将其提取到的完整路径。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx

于 2012-09-10T20:04:43.537 回答