4

如果加载程序集的用户没有足够的访问权限,当我尝试从 64 位进程加载它们时,我遇到了找不到 .Net 程序集的问题。

从 32 位进程加载相同的程序集不是问题,如果运行 64 位进程的用户被授予修改权限,则加载不是问题。

dll 文件位于文件共享上(我假设它是 NTFS,但不完全确定)并从 UNC 路径加载。

dll 不是在普通的 .Net 程序中加载,而是通过 Python.Net 在 Python 中使用,通过普通的 Matlab .Net 集成在 Matlab 中使用。Python和Matlab中的问题是相同的,因此表明问题出在.Net方面。

4

1 回答 1

5

有一个版本AppDomain.CurrentDomain.Load()接受byte[]包含要加载的 DLL 的文件内容。使用它,您可以很好地手动加载您可以访问的任何 .NET 程序集,无论它是在本地驱动器、网络、压缩、资源、下载等上。

在 C# 中,您可以使用如下内容:

public static Assembly LoadAssembly(string filename)
{
    var content = System.IO.File.ReadAllBytes(filename);
    return AppDomain.CurrentDomain.Load(content);
}

甚至不会尝试将其翻译成 Python.NET 或 Matlab。

由于文件读取不直接参与程序集加载,因此不会触发加载远程程序集的安全问题。还有一个额外的好处是 DLL 文件的锁定时间永远不会超过将其完全读入内存所需的时间。但是,确实需要更多的内存。

于 2015-10-06T08:42:14.530 回答