我遇到了一個問題,即如果通過部分信任環境中的部分信任環境中的某個屬性(如果直接創建)成功,但通過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的問題。
在此先感謝您的任何想法或幫助。