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



我只是想弄清楚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!'";
}
}
}

我在一个单独的项目中创建了一个域生成器,以下是内容:

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. AppDomian.Load 需要程序集的全名

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

请找到下面的了解 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);
}
}
}

我写了一篇涵盖相同介绍的博客。请随时查看我的博客以获取更多详细信息。使用应用程序域发送事件

相关内容

  • 没有找到相关文章

最新更新