Erro从Asp.Net应用程序加载第三方DLL

时间:2011-02-19 18:30:25

标签: asp.net iis-7.5 dll win64

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

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

这个外部dll从其他.net dll调用一些方法。

所以我们有:

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

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

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

环顾四周,我发现此代码已添加到application_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-hell但基本上我想复制当应用程序在visual studio开发服务器上运行良好时发生的事情。 我还读过IIS没有重新启动就没有解析添加的PATH所以我试图手动将c:\ external添加到PATH并重新启动但是会出现相同的错误。

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

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

尼古拉

1 个答案:

答案 0 :(得分:1)

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

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

所以如果:yourwebsite.dll - &gt; helper.dll - &gt; helperComponent.dll - &gt; widget.dll(其中 - &gt;是一个引用),当你构建时,helper.dll最终会在你的webb.dll旁边的bin目录中结束。您通常希望将它们全部放在同一个地方。那么你不必担心你的道路或任何这些东西。

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

这是关于项目组织的非常好的读物。 “复制本地”部分就是这个部分。您可以在Post Build事件中设置xcopy,将这些第二级和第三级引用放在解决方案文件下面的bin目录中。

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