ситуация довольно сложная (и мой английский очень простой), но давайте попробуем объяснить:
Я разрабатываю веб-службу Asp.net, вызывающую метод из внешней dll.
Эта внешняя dll вызывает некоторый метод из других .net dll.
Итак, у нас есть:
Asp.net WS ----> External.dll ----> other.NEt.Dll(---> other .netdll)
Вы должны знать, что внешняя dll использует путь (заданный методом инициализации) для разрешения своей внутренней ссылки.
В заключение у меня есть веб-приложение с добавленной ссылкой на мою External.dll и полностью доверенный путь ( c:\EXTERNAL ), полный всех .net dll, необходимых для external.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 в /bin моего приложения в wwwroot, но результат примерно такой:
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 и перезагрузиться, но появляются те же ошибки.
Спасибо за чтение, я надеюсь, что кто-то может помочь.
(извините за грамматические или орфографические ошибки! (я итальянец..))
Никола