我有一个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。
答案 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))