猿问

使用 AppDomain 将 dll 动态加载和卸载到我的项目中

我想在当前项目的单独解决方案中动态使用来自不同项目的类。我认为解决方案是将 dll 加载到我的项目中。我使用以下代码来完成我的任务并且它起作用了。


string dllPath = @"the path of my dll";

var DLL = Assembly.LoadFile(dllPath);

foreach (Type type in DLL.GetExportedTypes())

{

      if (type.Name == "targetClassName")

      {

          var c = Activator.CreateInstance(type);

          try

          {

              type.InvokeMember("myMethod", BindingFlags.InvokeMethod, null, c, new object[] { "Params" });

          }

          catch(Exception ex)

          {

             MessageBox.Show(ex.Message);

          }

          break;

      }

}

但是,我现在的问题是我想卸载dll,我不能这样做,因为Assembly中没有卸载方法。我找到的解决方案是我必须使用 AppDomain 加载程序集,然后卸载它。


现在这是我的主要问题。我不断得到FileNotFoundException。这是我的代码:


public class ProxyDomain : MarshalByRefObject

{

    public Assembly GetAssembly(string assemblyPath)

    {

        try

        {

            return Assembly.LoadFrom(assemblyPath);

        }

        catch (Exception ex)

        {

            throw new InvalidOperationException(ex.Message);

        }

    }

}


private void BuildButton_Click(object sender, EventArgs e)

{

    string dllPath = @"DllPath";

    string dir = @"directory Path of the dll";

    AppDomainSetup domaininfo = new AppDomainSetup();

    domaininfo.ApplicationBase = System.Environment.CurrentDirectory;

    Evidence adevidence = AppDomain.CurrentDomain.Evidence;

    AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);


    Type Domtype = typeof(ProxyDomain);

    var value = (ProxyDomain)domain.CreateInstanceAndUnwrap(

         Domtype.Assembly.FullName,

         Domtype.FullName);


    var DLL = value.GetAssembly(dllPath);


    // Then use the DLL object as before

}

最后一行是以下例外 Could not load file or assembly 'dll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.


我已经尝试过此链接上的解决方案,但没有任何效果对我有用...我一直遇到相同的异常。之后我想卸载域,但是我无法解决加载dll的第一个问题。如何修复我的代码?


编辑


当我在我的项目的同一个 bin 文件夹中复制预期的 dll 时,它可以工作。但是,我不想在我的项目中复制 dll。有没有办法从它的路径加载它而不将它复制到我的 bin 文件夹?


慕斯王
浏览 228回答 1
1回答
随时随地看视频慕课网APP
我要回答