2009-12-07 69 views
0

我有一個COM(用.NET編寫)需要創建一個AppDomain並在其中加載/執行.NET程序集。以便我可以隨後卸載該appDomain以及所有加載的dll。在正常(例如WinForms).NET應用程序中正常工作時,如果此代碼從COM環境中運行,則會出現安全性異常。假設COM程序集是強命名的並放置在GAC中,它具有完全信任策略。任何人都可以解釋這是否可能,如果沒有 - 爲什麼?C#.NET COM組件可以執行或加載程序集嗎?

+0

你得到了什麼樣的安全異常?我有一個.NET COM LocalServer應用程序工作正常(我不使用GAC)。 – 2009-12-07 08:24:38

+0

請求「System.Security.Permissions.SecurityPermission,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089」類型的權限失敗。當我嘗試AppDomain.executeAssembly()時。 當我嘗試加載FileIOPermission(或類似的)異常時,我得到了一個。 – Revenge 2009-12-07 08:42:33

+0

在創建對象時,我也切換到了COM組件的GAC原因,例如,從c + +代碼我得到了fileNotFound的執行。當我將COM程序集放入GAC時,它工作正常。然後我得到了安全性例外,所以我簽署了我使用的程序集,並嘗試將它們放入GAC中 - 沒有解決。 – Revenge 2009-12-07 08:46:35

回答

0

是的,它可以。爲了讓CAS能讓你這樣做,你應該在COM程序集和加載程序集中包含

[assembly: System.Security.AllowPartiallyTrustedCallersAttribute()] 

屬性。 還創建對象和執行組件將需要一個適當的權限集加入到這樣的新的應用程序域:

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