В момента изграждам малък вграден уеб сървър, използвайки Mono (използвайки MonoDevelop на Linux). Докато се опитвах да открия типа на браузъра с помощта на препоръка от примерен код, се натъкнах на проблем. Програмата се компилира правилно, но кодът по-долу води до срив на програмата при влизане във функцията, където е декларирана:
using System.Collections;
using System.Collections.Specialized;
using System.Web;
using System.Web.Configuration;
[...]
var l_caps = new HttpBrowserCapabilities
{
Capabilities = new Hashtable { { string.Empty, p_http_context.Request.UserAgent } }
};
var l_capsFactory = new BrowserCapabilitiesFactory();
l_capsFactory.ConfigureBrowserCapabilities(new NameValueCollection(), l_caps);
Кодът по-горе трябваше да анализира низа на потребителския агент за заглавките на заявка (налични на p_http_context.Request.UserAgent), позволявайки възможностите на браузъра на клиента да бъдат изложени на сървърната страна в обекта l_caps. Въпреки това, ако следният ред присъства в кода, веднага щом програмният поток достигне функцията, той предизвиква изключението, описано по-долу. Коментирането на реда избягва изключението, но само защото премахва функционалността:
var l_capsFactory = new BrowserCapabilitiesFactory();
Получената грешка е следната:
System.TypeLoadException: Не може да разреши тип с токен 01000028 от typeref (очакван клас > 'System.Web.Configuration.BrowserCapabilitiesFactory' в сборка 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') на сървъра .Context.onNewRequest (System.Object p_origin, >Server.Listener+NewContextEventArgs p_args) [0x000b9] в Context.cs:143
Нямам никакъв пакет NuGet. Аз не използвам ASP.Net, това е чисто конзолно приложение (демон), използващо HttpListener. Като такива, конвенционалните методи за получаване на възможностите на браузъра не са налични (а именно Request.Browser не е наличен в този контекст).
Опитах следното:
- различни версии на включените библиотеки;
- почистване на разтвора;
- премахване на всички папки bin и obj от решението и подпроектите;
- изграждане както в режим на отстраняване на грешки, така и в режим на освобождаване;
- преинсталиране;
- комбинации от горните.
Също така търсих решения за няколко подобни проблема както на Stack Overflow, така и на други платформи, но нито едно от решенията за тези проблеми, когато беше намерено, не оказа положително влияние върху тази конкретна ситуация. Примери:
- System.TypeLoadException: Не може да се разреши тип с токен 01000115
- Необработено изключение: System.TypeLoadException: Не може да разреши тип с токен 0100003b
- Не може да се разреши тип с токен 0100000f
- System.TypeLoadException: Не може да се разреши тип с токен 0100000f
- xamarin: System.TypeLoadException: Не може да разреши тип с токен 01000017
- System.TypeLoadException: Не може да се разреши тип с токен 0100000c
- System.TypeLoadException: Не може да се разреши тип с токен 01000019
Версии:
- Моно 5.18.1.3
- .Net Framework 4.7, 4.7.1, 4.7.2
- C# версия: всички от 5 до 7.3
- MonoDevelop 7.8.2
- Linux Ubuntu 18.04
Като опит за груба диагностика на това, аз също направих grepping моно библиотеките в /usr/lib/mono за токена „BrowserCapabilitiesFactory“, давайки положителни резултати.
Някой има ли някакви предложения за решаване на по-нататъшното диагностициране на тази ситуация?
Липсва ли някаква допълнителна справка за сглобяване в проекта?
System.Web.Instrumentation.PageInstrumentationService
токен 01000039. Класът изглежда съществува в моя mono/4.6.2-api/System.Web.dll. Нямам идея как да поправя. - person SandRock   schedule 30.01.2021