使用AppDomain.Load将DLL文件加载到新创建的应用程序域中。

时间:2018-03-12 22:38:30

标签: appdomain appdomainsetup

我只想弄清楚AppDomain并将来自不同位置的DLL加载到新创建的AppDomain中并遇到困难。我知道我将使用不同的方法,但我仍然试图弄清楚这一点。这是示例的背景故事。

我有一个名为MyReadableDLL.dll的dll位于c:\ DLLTest中。这是内容:

namespace MyReadableDLL
{
        public class ReadThis : System.MarshalByRefObject
        {
        public string RetString()
            {
                    return "You read this from 'Read This!'";
            }
        }
}

我在一个单独的项目中创建了一个DomainBuilder,其内容如下:

    class DomainBuilder
    {
        AppDomainSetup domaininfo = new AppDomainSetup();
        AppDomain appDomain;

        public DomainBuilder()
        {
            domaininfo.ApplicationBase = @"c:\DLLtest";
                    appDomain = AppDomain.CreateDomain("MyTestDomain", null, domaininfo);
        var currentdomain = AppDomain.CurrentDomain.FriendlyName;
                var temporarydomain = appDomain.FriendlyName;
                var appbase = appDomain.SetupInformation.ApplicationBase;
                Assembly assembly = appDomain.Load("MyReadableDLL");
    }
}

当我得到appDomain.Load行时,我不明白它失败的原因。从我读过的关于AddDomainSetup的内容来看,AppliationBase设置了用于检查EXE / DLL文件的默认目录,并且该文件夹中只有MyReadableDLL文件。 我已经看到许多使用CreateInstanceFromandUnwrap的解决方案,并且我确定我会朝那个方向前进。与此同时,我试图找到一个工作示例:1)AddDomain创建,然后2)AppDomain.Load到新创建的域中。就是这样。我错过了什么?

1 个答案:

答案 0 :(得分:0)

上述情况中出现明显失败的原因很多。

  1. AppDomian.Load需要程序集的全名

    "EventsPublisher, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    
  2. 确保以管理员身份运行程序以克服安全例外

  3. 请查看下面的AppDomain理解示例,其中显示了在另一个应用程序域中执行代码的最简单方法。

    using System;
    using System.Reflection;
    
    public class Worker : MarshalByRefObject
    {
        public void PrintDomain() 
        { 
            Console.WriteLine("Object is executing in AppDomain \"{0}\"",
                AppDomain.CurrentDomain.FriendlyName); 
        }
    }
    
    class Example
    {
        public static void Main()
        {
            // Create an ordinary instance in the current AppDomain
            Worker localWorker = new Worker();
            localWorker.PrintDomain();
    
            // Create a new application domain, create an instance
            // of Worker in the application domain, and execute code
            // there.
            AppDomain ad = AppDomain.CreateDomain("New domain");
            Worker remoteWorker = (Worker) ad.CreateInstanceAndUnwrap(
                typeof(Worker).Assembly.FullName,
                "Worker");
            remoteWorker.PrintDomain();
        }
    }
    
    /* This code produces output similar to the following:
    
    Object is executing in AppDomain "source.exe"
    Object is executing in AppDomain "New domain"
     */
    

    请查看以下示例以加载程序集

    using System;
    using System.Reflection;
    
    class Test {
    
       static void Main() {
          InstantiateINT32(true);      // OK!
       }
    
       static void InstantiateINT32(bool ignoreCase) {
          try {
             AppDomain currentDomain = AppDomain.CurrentDomain;
             object instance = currentDomain.CreateInstanceAndUnwrap(
                "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
                "SYSTEM.INT32",
                ignoreCase,
                BindingFlags.Default,
                null,
                null,
                null,
                null,
                null
             );
             Console.WriteLine(instance.GetType());
          } catch (TypeLoadException e) {
             Console.WriteLine(e.Message);
          }
       }
    }
    

    我写了一篇博客,内容相同。请随时查看我的博客,了解更多相关细节。 Sending Events using AppDomain