能否在C#.NET COM组件中执行或加载程序集?

能否在C#.NET COM组件中执行或加载程序集?,.net,com,appdomain,.net,Com,Appdomain,我有一个COM(用.NET编写),它需要创建一个AppDomain并在其中加载/执行.NET程序集。这样我以后就可以卸载appDomain和所有加载的dll了。在正常(例如WinForms).NET应用程序中正常工作时,如果此代码在COM上下文中运行,则会出现安全异常。假设COM程序集具有强名称并放置在GAC中,则它具有完全信任策略。有人能解释一下这是否可行,如果不可行,原因是什么吗?是的,可以。为了让CAS允许您这样做,您应该包括 [assembly: System.Security.Allo

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

是的,可以。为了让CAS允许您这样做,您应该包括

[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);
}
但在它执行之后,代码无权做任何“复杂的事情”


您可以了解更多信息。

您遇到了什么样的安全异常?我有一个运行良好的.NET COM LocalServer应用程序(不过我不使用GAC)。请求类型为“System.Security.Permissions.SecurityPermission,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的权限失败。当我尝试AppDomain.executeAssembly()时。当我尝试加载ONE时,我得到FILIOFROMPUTE(或SMTH类似)异常。我也切换到COM组件的GAC,因为当创建对象时,例如从C++代码中得到了文件名的发现。当我将COM组件放入GAC时,它工作正常。然后我得到了安全例外,所以我签署了我使用的程序集,并尝试将它们放入GAC中,但没有成功。