【问题标题】:Erro loading third party dll from Asp.Net Application错误从 Asp.Net 应用程序加载第三方 dll
【发布时间】:2011-02-19 18:30:25
【问题描述】:

情况很复杂(我的英语很基础),但让我们试着解释一下:

我正在开发一个从外部 dll 调用方法的 Asp.net Web 服务。

此外部 dll 调用其他 .net dll 的某些方法。

所以我们有:

Asp.net WS ----> External.dll ----> other.NEt.Dll(---> other .netdll)

您必须知道外部 dll 使用路径(由初始化方法给出)来解析其内部引用。

总之,我有一个 Web 应用程序,其中添加了对我的 External.dll 的引用和一个完全受信任的路径 (c:\EXTERNAL),其中包含 external.dll 所需的所有 .net dll。

环顾四周,我发现此代码要添加到应用程序_START:

Dim path As String = String.Concat(System.Environment.GetEnvironmentVariable("PATH"), ";", "c:\EXTERNAL)
    System.Environment.SetEnvironmentVariable("PATH", path, EnvironmentVariableTarget.Machine)

这会将我的 c:\EXTERNAL 添加到全局环境 PATH。

通过从 Visual Studio 开发服务器运行此配置,我没有收到任何错误,并且一切正常。

当我在本地 IIS 服务器上发布应用程序时,它会出现各种错误: 起初结果是这样的:

Failure reading <Myobject> control of <(static)> type
Unable to create <myobject> object (<C:\(WRONGPATH)\needed.net.dll> assembly)

为了解决这个问题,我尝试将所需的 .net dll 添加到我在 wwwroot 中的应用程序的 /bin 中,但结果类似于:

Failure reading <MyType> control of <Myobject> type
Error returned by .NET Framework: 
System.ArgumentException: Un oggetto di tipo 'ComNet.BaseControl.LoginDisplayLayout' non può essere convertito nel tipo 'ComNet.BaseControl.LoginDisplayLayout'.
   in System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
   in System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
   in System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   in System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   in System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   in System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
   in CDotNetType.bSetProperty(CDotNetType* , Object gcrObj, SByte* pszNom, CSLevel* pclPile, Int32 nDimension, Int32* pnTabDimension, STOperationDotNet* pstOperation)

这一次看起来它正在加载相同的 dll,但从不同的位置导致冲突。

现在就是这样。我很难解释这个 dll 地狱,但基本上我想复制当应用程序在 Visual Studio 开发服务器中运行良好时发生的事情。 我还读到 IIS 在不重新启动的情况下无法解析添加的 PATH,因此我尝试手动将 c:\external 添加到 PATH 并重新启动,但出现相同的错误。

感谢您的阅读,希望有人能提供帮助。

(抱歉语法或拼写错误!(我是意大利人..))

尼古拉

【问题讨论】:

    标签: asp.net iis-7.5 dll win64


    【解决方案1】:

    尝试将所有外部 .NET dll 放入您网站的 bin 目录中。

    当您在 Visual Studio 中将引用添加到单独的库或项目时,它通常会将 DLL 从该项目复制到您网站的 BIN 目录中,但它不会总是抓取该项目所依赖的 DLL 文件。

    所以如果:yourwebsite.dll --> helper.dll --> helperComponent.dll --> widget.dll(其中 --> 是一个引用),当你构建时,只有 helper.dll 最终在 bin 目录中在 yourwebsite.dll 旁边。您通常希望将所有这些都放在同一个地方。那么您就不必担心您的路径或其他任何事情。

    或者,如果所有这些程序集都是强命名的,您可以使用 gacutil 将它们添加到全局程序集缓存中,并通过它们的标识符而不是文件来引用它们。

    这是一本关于项目组织的很好的读物。 “复制本地”部分涉及到这一点。您可以在 Post Build 事件中设置 xcopy,以将这些 2 级和 3 级引用放在解决方案文件下方的 bin 目录中。

    http://www.simple-talk.com/dotnet/.net-framework/partitioning-your-code-base-through-.net-assemblies-and-visual-studio-projects/

    【讨论】:

    • 嗨,谢谢您提供的信息,我尝试将所有 dll 添加到 \bin 文件夹,但我收到了我的答案中描述的错误,看起来它正在加载相同的 dll 但来自不同的位置导致冲突。最后的希望是 gacutil。奇怪的是无法复制 Visual Studio 开发服务器中的工作
    • 如果程序集安装在全局程序集缓存中并且您的 ref 是强类型程序集,它将从 GAC 而不是您的 bin 目录加载程序集。在记事本中查看您的 .csproj 文件以获取如下所示的引用:... 如果是这样,请参阅如果您在 VS 命令提示符下使用 gacutil /l AjaxControlToolkit 在 GAC 中有匹配的记录。如果有,请尝试从引用中删除程序集名称之后的所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多