2011-05-28 59 views
1

我遇到了一個問題,即如果通過部分信任環境中的部分信任環境中的某個屬性(如果直接創建)成功,但通過GAC編輯的部分與AllowPartiallyTrustedCallers屬性調用另一個GAC編輯的程序集而不是反射。使用反射時LinkDemand檢查失敗 - 「該程序集不允許部分受信任的調用者。」

裝配體涉及:

  • AssemblyA(安裝在GAC,已經AllowPartiallyTrustedCallers,不能被修改)
  • AssemblyB(安裝在GAC,確實已經AllowPartiallyTrustedCallers,不能被修改)
  • AssemblyC(安裝在GAC中,確實有有AllowPartiallyTrustedCallers,可以修改)
  • AssemblyD(有簽名,但未安裝在GAC中,確實有有AllowPartiallyTrustedCallers,可以修改)。

我需要從AssemblyD直接和間接調用AssemblyA中的代碼。對於直接調用,我只是將它們從AssemblyD移到AssemblyC中,一切正常。對於間接調用,我需要調用AssemblyB中的一個方法,它將在內部使用Reflection在AssemblyA中創建一個類的實例。我可以直接從AssemblyD向AssemblyB發出呼叫,或者通過AssemblyC間接向AssemblyB發出呼叫 - 兩種都可以接受,但都不適用於我。

直接通話效果很好。如果調用堆棧中存在任何部分受信任的代碼,則使用反射的調用將失敗。我無法避免AssemblyB正在做的反射調用 - 它在進行這些調用之前爲我做了很多其他工作 - 我無法在AssemblyC中複製並直接調用這些調用。

我已經上傳了一個演示BitBucket的項目:https://bitbucket.org/jorupp/partialtrusttest。根據我對部分信任的理解,所有4個應該工作(直接從B或C調用A,並通過B或C的反射調用A),但基於反射的調用失敗。

我猜我需要在AssemblyC中的代碼中聲明一些CAS權限或類似代碼才能使其工作,但我無法弄清楚什麼。注意:我的場景中的名稱顯然是人爲設計的,但實際場景是Sharepoint應用程序,其中AssemblyA是Microsoft.Sharepoint.Taxonomy,AssemblyB是Microsoft.Sharepoint,AssemblyC是我自定義的GAC-ed程序集, AssemblyD是我自定義的webapp部署的程序集。就我所知,這不是一個特定於Sharepoint的問題。

在此先感謝您的任何想法或幫助。

回答

1

後,我花了一個小時寫了攝製情況和問題解釋它,我無意中發現了一個解決方案(雖然我不知道這是正確的):我試圖用這樣的代碼

這個(在AssemblyC中)

public void UseClassBToCreateClassAViaReflection() 
{ 
    new SecurityPermission(PermissionState.Unrestricted).Assert(); 
    ClassB.CreateClassAViaReflection(); 
} 

哪一個不工作。然而,這確實:

[PermissionSet(SecurityAction.Assert, Name = "FullTrust")] 
public void UseClassBToCreateClassAViaReflection() 
{ 
    ClassB.CreateClassAViaReflection(); 
} 

我還沒有完全得到CAS,但至少這讓我過去我的第一個問題,在我的下一個。我不認爲我在這裏創造了一個巨大的安全整體,但我不太確定...

相關問題