我有一个场景,我从我的C#代码中的操作添加DLL到GAC.然后我需要对新添加的DLL执行Assembly.Load.但是,由于进程启动时DLL不在GAC中,因此返回null.
因此,我看到代码可以在不同的AppDomain中运行,这将导致DLL在单独的AppDomain中从GAC获得.
如何将其他AppDomain中的值返回到主线程?
我只是想跑:
var type = Assembly.Load(assembly).GetType(className);
让它从其他AppDomain返回到我的主线程.
提前致谢.
你必须使用.NET Remoting玩一点.您在其他AppDomain上加载的对象需要从MarshalByRefObject类派生(http://msdn.microsoft.com/en-us/library/system.marshalbyrefobject.aspx).
为了节省时间,这里是该链接的代码:
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(
Assembly.GetExecutingAssembly().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"
*/
Run Code Online (Sandbox Code Playgroud)
一般来说,在应用程序域之间共享的对象必须从MarshalByRefObject派生。如果在动态加载的DLL中定义了类型,则返回实际类型会遇到问题。由于该类型在主线程的AppDomain中不可用。您可能可以将其强制转换为已经在主应用程序线程中加载的DLL中可用的基类。
我过去所做的是为我想在应用程序域之间共享的类创建一个接口。显然,该接口将位于主应用程序和动态加载的dll共享的某个基本dll中。
在您的基本dll中,您可以声明您的接口:
public interface IMyBaseInterface
{
void DoStuff();
}
Run Code Online (Sandbox Code Playgroud)
然后,在动态加载的dll中,该类实现接口并从MarshalByRefObject派生:
public class MyDynamicClass : MarshalByRefObject, IMyBaseInterface
{
public void DoStuff()
{
Console.WriteLine("Hello other app domain!");
}
}
Run Code Online (Sandbox Code Playgroud)
加载对象实例的代码如下所示:
AppDomainSetup ads = new AppDomainSetup();
AppDomain appDomain = AppDomain.CreateDomain(_appDomainName, null, ads);
IMyBaseInterface myObj = (IMyBaseInterface) appDomain.CreateInstanceAndUnwrap(assemblyName, typeName);
myObj.DoStuff();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4536 次 |
| 最近记录: |