1

我有一个使用反射来加载程序集 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 才能使用反射,而非反射代码在网络上可以正常工作。难道没有一种程序化的方式来表达“我完全信任我通过网络加载的这个程序集。”?对此表示赞赏。

4

2 回答 2

1

DLL 在 Internet 上上传并下载后,它们会出现信任问题。那些需要通过进入“属性”并单击“解除阻止”按钮来明确解除阻止,问题可能会得到解决。

在此处输入图像描述

于 2020-01-28T14:06:02.207 回答
0

当我运行下面的行时,我在 powershell 中收到了同样的错误:

Add-Type -Path WinSCPnet.dll

要解决这个问题,我所要做的就是将 powershell 更新到 v3。

http://www.microsoft.com/en-us/download/details.aspx?id=34595

当我尝试调整区域安全设置(https://social.msdn.microsoft.com/Forums/en-US/d5135c8b-7629-464b-9078-8c179010ea82/minimum-permission-requests?forum=vblanguage)时,我不能'找不到 .Net Framework 配置工具。我想我找不到它,因为我的默认 .Net 框架是 4.0。

于 2015-06-17T18:36:35.530 回答