可以在C#.NET COM组件中执行或加载程序集吗?

时间:2009-12-07 08:12:20

标签: .net com appdomain

我有一个COM(用.NET编写),需要创建一个AppDomain并在其中加载/执行.NET程序集。这样我以后可以卸载appDomain以及所有加载的dll。在正常(例如WinForms).NET应用程序中正常工作时,如果此代码在COM上下文中运行,则会出现安全性异常。假设COM程序集被强烈命名并放置在GAC中,它具有完全信任策略。任何人都可以解释这是否可能,如果没有 - 为什么?

1 个答案:

答案 0 :(得分:0)

是的,它可以。为了让你这样做,你应该包括

[assembly: System.Security.AllowPartiallyTrustedCallersAttribute()]
COM程序集中的

属性和已加载的程序集。 另外,创建对象和执行程序集需要向新的应用程序域添加适当的权限集,如下所示:

 AppDomainSetup setup = new AppDomainSetup();
 setup.ApplicationBase = Path.GetDirectoryName(path); 
 PermissionSet trustPermissionSet = new PermissionSet(PermissionState.Unrestricted);
 AppDomain newDomain = AppDomain.CreateDomain( "descriptive name", null, setup, trustPermissionSet);

然后您可以通过CreateInstanceFromAndUnwrap()executeAssembly创建对象。 此问题还有一个解决方法 - 使用Activator

System.Runtime.Remoting.ObjectHandle objHandle = Activator.CreateInstanceFrom(_pluginStore[path], path, pluginClass);

if (objHandle != null)
{
    object unwrappedInstance = objHandle.Unwrap();
    result.Add(unwrappedInstance);
}

但在执行代码无权执行任何“复杂的事情”之后。

您可以找到更多here