使用无保证路径添加对dll的引用

时间:2015-08-10 13:30:21

标签: c# dll dynamic-loading

在VS中添加对DLL的引用完全没有问题。但是,通过此方法添加引用需要DLL在编译和运行时处于特定路径中。

现在这是我的问题:我想要引用的DLL不能保证在不同机器上的同一位置。 DLL的位置取决于用户安装DLL打开API的程序。 即在机器A上,DLL位于C:\ SomeLocation \ api.dll,而在机器B上,DLL位于F:\ ThisAwesomeProgram \ api.dll。

我可以在VS中添加对DLL的引用,就像我添加引用的任何其他DLL一样使用它,然后(在运行时)更改DLL的路径并仍然使用它吗? 或者我是否需要使用Assembly.LoadFrom之类的东西,然后通过反射和动态调用来调用方法?

以下是我打算使用的工作流程:

  • 在Visual Studio中编译时添加对DLL的引用。
  • 使用DLL,就好像路径永远不会改变一样。
  • 像往常一样编译程序。
  • 启动程序,然后将DLL位置更改为实际位置(如果与编译时已知的位置不同)。
  • 使用程序部件照常使用DLL。

5 个答案:

答案 0 :(得分:1)

我也编写过类似的东西。我使用的API是与我的另一个程序一起提供的dll。但是如果用户更改了安装路径,我就无法找到dll。我通过创建一个注册表项解决了这个问题,我在安装第一个程序时存储了路径,然后在我的代码中引用它。我不知道您的问题是否与我的问题相同,但如果您可以修改安装例程,则可以尝试此操作。

答案 1 :(得分:0)

您可能正在寻找Global Assembly Cache (GAC),这是一种在多个应用程序之间共享您的dll的方法。

答案 2 :(得分:0)

您可以从任何地方引用装配体。项目文件将包含" hintpath",或编译器应查找的位置。所以编译时你很好。

在运行时,您仍需要加载程序集。如果"复制本地"设置为false,运行时无法找到程序集。您可以使用Assembly.LoadFrom(@"full\path")从路径加载程序集。

也就是说,如果您知道完整路径。看起来您正在尝试与第三方应用程序的API进行通信。也许他们将安装目录存储在注册表中,因此您可以进行探测。

答案 3 :(得分:0)

您可以订阅AssymblyResolve活动:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

And load it from file

答案 4 :(得分:-1)

YouTube上的这个video有它。 您需要做的是获取dll文件并将其嵌入您的程序中。从那里,您将能够使用下面的代码加载它。

    [STAThread]
    static void Main()
    {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Program.CurrentDomain_AssemblyResolve);
        Application.Run(new Form1());
    }

    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EmbedAssembly.WhateverDll.dll"))
        {
            byte[] assemblyData = new byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
        }
    }