我有一个使用反射来加载程序集 X 的 winforms 应用程序。它在我的本地计算机上运行良好,但在从网络共享运行时会出错。我创建了一个代码组,授予来自共享的程序集完全信任(仅用于测试)(通过指定 url 属性)。该应用程序现在启动。但是,当我尝试执行需要 X 访问依赖程序集 Y 的操作时,它会出现以下错误:
Could not load file or assembly 'Bloomberg.Api, Version=1.8.0.3,
Culture=neutral, PublicKeyToken=65c07ea3148235aa' or one of its dependencies. Failed to grant minimum
permission requests. (Exception from HRESULT: 0x80131417)
我正在使用以下代码将程序集 X 加载到 appdomain 中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.IO;
using System.Reflection;
using TCPSecurityMaster;
using System.Windows.Forms;
using System.Security.Policy;
using System.Security;
using System.Security.Permissions;
namespace SecurityMasterReflectionTest
{
class Program
{
static void Main(string[] args)
{
try
{
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationBase = ConfigurationManager.AppSettings["SecurityMasterBinDir"];
ads.ConfigurationFile = Assembly.GetEntryAssembly().Location + ".config";
AppDomain newAD = AppDomain.CreateDomain("SM", null, ads);
string dir = ConfigurationManager.AppSettings["SecurityMasterBinDir"];
string asmName = dir + "\\" + ConfigurationManager.AppSettings["SecurityMasterFacadeAssemblyName"];
string typeName = ConfigurationManager.AppSettings["SecurityMasterFacadeClassName"];
if (File.Exists(asmName))
{
object obj = (ISecurityMasterAPI)newAD.CreateInstanceFromAndUnwrap(asmName, typeName);
ISecurityMasterAPI api = obj as ISecurityMasterAPI;
api.Initialize();
Form f = api.GetSecurityDetailDialog(35516);
f.ShowDialog();// this works, but a subsequent operation that requires assembly Y to be loaded doesn't
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
我原以为将完全信任授予网络共享下的所有程序集会解决任何 CAS 问题。任何提示表示赞赏。
- 更新
在我的代码组中,我将权限集指定为“Everything”而不是“Full Trust”。更改为“完全信任”修复了该错误。但是,我仍然感到困惑的是,我必须调整 CAS 才能使用反射,而非反射代码在网络上可以正常工作。难道没有一种程序化的方式来表达“我完全信任我通过网络加载的这个程序集。”?对此表示赞赏。