状況は非常に複雑です(そして私の英語は非常に基本的です)が、説明してみましょう:
外部 dll からメソッドを呼び出す Asp.net Web サービスを開発しています。
この外部 dll は、他の .net dll から何らかのメソッドを呼び出します。
したがって、次のようになります。
Asp.net WS ----> External.dll ----> other.NEt.Dll(---> other .netdll)
外部 dll はパス (初期化メソッドで指定) を使用して内部参照を解決することを知っておく必要があります。
結論として、External.dll への参照が追加された Web アプリケーションと、external.dll に必要なすべての .net dll でいっぱいの完全に信頼されたパス ( c:\EXTERNAL ) があります。
周りを見回すと、このコードを 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 地獄を説明するのは難しいですが、基本的には、Visual Studio 開発サーバーでアプリケーションが正常に動作するときに何が起こっているかを再現したいと考えています。また、IIS は再起動せずに追加された PATH を解決しないことも読んだので、手動で c:\external を PATH に追加して再起動しようとしましたが、同じエラーが表示されます。
読んでくれてありがとう、誰かが助けてくれることを願っています。
(文法やスペルミスでごめんなさい! (私はイタリア人です..))
ニコラ