【问题标题】:Unable to load libraries (.dll) in a C# Website Application无法在 C# 网站应用程序中加载库 (.dll)
【发布时间】:2017-03-14 02:40:11
【问题描述】:

我们有一个 .Net 应用程序,它成功地从 Windows 操作系统中的特定文件夹“加载”了 .dll 库。到目前为止,我们一直在使用的 .Net 框架是 4.6。 应用程序加载的所有 .dll 库都是在 x86 中编译的。以下代码是我们如何加载库并获取它们的类型的摘录:

1. try{
2.   AssemblyFileDescriptor assemblyFile = new AssemblyFileDescriptor(assemblyPath);
3.  var assm = Assembly.LoadFrom(assemblyPath);
4.  var types = assm.GetExportedTypes();
5.  ...
6. }catch (Exception e) {
7.  ...} 

特定文件夹中的库,比如说

C:\Program Files (x86)\FOLDER

,正在加载到变量assm,没有任何异常。当我们将 .Net “独立”应用程序迁移到具有 Web.config 文件的网站应用程序时,就会出现问题。在网站应用程序中,加载函数在获取类型时失败。然后第 4 行抛出异常。我们一直在使用 ISS Express。

我们已经尝试过了:

  1. 使用不同的加载函数,例如“UnsafeLoadFrom”。
  2. 在 x86 和 x64 中重新编译所有 .dll 库。
  3. 为 Web.Config 文件设置不同的配置,例如包括 <trust level="Full" /><loadFromRemoteSources enabled="true" />
  4. 调试各个库的加载功能。其中一些可以成功加载,但还有一些抛出 Loading Exception
  5. 在 ISS Express 中设置“True”变量“启用 32 位应用程序”。

具体错误状态为“System.Reflection.ReflectionTypeLoadException”:

知道如何解决这个问题吗?如果您需要更多信息,请告诉我。

【问题讨论】:

  • 您有异常详情吗?可能有助于解决问题。

标签: c# asp.net .net dll web


【解决方案1】:

我猜你是在 IIS 下运行它,而 IIS 通常以与你不同的用户身份运行(通常是IUSR),并且通常具有有限的权限。将独立程序转换为 ASP.NET 程序会以微妙的方式改变很多事情。我会检查以确保您没有遇到文件权限问题,因为 IIS 是受限用户。

另外,正如其他人指出的那样,您可能应该提供异常详细信息(至少是其类型名和消息),这样人们就不必猜测了。

【讨论】:

  • 我们在 ISS Express 下运行该应用程序。我们是否应该配置一个独立的 ISS 进行测试?具体错误是“System.Reflection.ReflectionTypeLoadException”。描述指出变量 assm 启动了“System.TypeLoadException”。
  • 嗯,不,IIS express 以您的用户身份运行 (stackoverflow.com/questions/8446359/…)。因此,这可能不是权限问题。在您解决这个问题之前,我不建议您切换到完整的 IIS。
  • 其实,想一想:既然 IIS Express 以 you 身份运行,您是否尝试将这些文件移动到 you 拥有的文件夹中? Program Files 非常特别,UAC 和权限可能会干扰其中的任何内容。您可能想尝试将这些 DLL 移动到项目下的文件夹中,以确保它们位于代码可以读取的位置。
  • 我们已经尝试从项目的 Documents 文件夹和 Bin 文件夹中加载 DLL。例外情况保持不变。
  • 好吧,我想你可以试试真正的 IIS。这可能会引发另一种蠕虫,但由于 IIS 和 IIS Express 并不是真正意义上的同一机器,因此有时事情可以在一个中运行而在另一个中不起作用。 (例如,我公司的旗舰应用程序不会在 IIS Express 下运行根本,原因太复杂,无法在此详述;但重点是它们绝对不是同一个系统。)
【解决方案2】:

根据this question 的回答和我们在网站应用程序中进行的几个加载实验。我们观察到与用于编译 DLL 和 ReflectionTypeLoadException 的框架版本相关的模式。一些 DLL 是使用 framework 3.5 编译的,此版本不允许使用 .Net CLR2 在 ISS 中加载库。然后,我们必须使用更高版本的框架(.Net v4.0)重建所有 DLL 及其依赖项。最后,我们使用 .NET CLR4 在 ISS express 中重新加载了更新的 DLL。 DLL 被加载,没有任何异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多