在winforms中使用Assembly.LoadFrom(String)无法获取所需的权限错误

时间:2014-10-09 11:11:36

标签: winforms c++-cli

我有一个winforms应用程序,它在运行时使用Assembly.LoadFrom(String)加载一些dll(我也已经与app一起编写和安装)。 dll位于放置exe的路径的子目录中。

有时候,应用程序无法在特定计算机上启动并出现例外情况"无法加载文件或程序集“mydll,Version = 1.2.4.0,Culture = neutral,PublicKeyToken = null&#39 ;或其中一个依赖项。无法授予最低权限请求。 (HRESULT的例外情况:0x80131417)"和内部异常"无法获取所需权限" at" System.Security.SecurityManager.ResolvePolicy(证据证据,PermissionSet reqdPset,PermissionSet optPset,PermissionSet denyPset,PermissionSet& denied,Boolean checkExecutionPermission)"。

代码很简单:    Assembly^ myAssembly = Assembly::LoadFrom(path);

dll需要在运行时加载,因为它们是可选的。

我一直在研究这个问题,但我发现所有与asp.net有关,这对我没有多大帮助。我没有使用任何asp.net。 它只发生在我无法访问的非常非常少的机器上我既不知道用户权限,但应用程序在任何操作中都不需要管理员权限,并且使用有限的用户权限运行。

有没有办法可以保护应用程序并加载DLL?显然,我可以处理异常,但最终,我需要加载dll。

2 个答案:

答案 0 :(得分:0)

不能说这个答案对你有什么好处,但是我使用另一种方法加载机制:

String dllFolder = "folder of DLLs";
DirectoryInfo di = new DirectoryInfo(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), dllFolder));
FileInfo[] fia = di.GetFilesByExactExtension("dll", SearchOption.TopDirectoryOnly);
foreach (FileInfo fi in fia)
{
   Byte[] bytes = File.ReadAllBytes(fi.FullName);
   if (bytes.Length > 0)
   {
       Assembly theDLL = Assembly.Load(bytes);
       if (theDLL != null)
       {
           //...optionally do something more with the instance
       }
   }
}

我通过Load()"直接从文件中加载"方法

GetFilesByExactExtension()是一种扩展方法,顺便说一句。

答案 1 :(得分:0)

你可以尝试:

Assembly^ myAssembly = Assembly::LoadFrom(Path::Combine(AppDomain::CurrentDomain->BaseDirectory, path))