Я создаю видимую библиотеку COM, содержащую класс с интерфейсом IDTExtensibility2, чтобы использовать его в качестве надстройки для редактора Microsoft VBA для Microsoft Excel.Отправка запроса GET с помощью HttpClient внутри.Мой запрос содержит закодированную строку ("/" заменен на "% 2F", "." На "% 2E" и т. Д.), Но ответ содержит ошибку.Дополнительные исследования показывают, что выглядит как входной Uri со строкой типа для метода GetAsync, преобразованного в объект System.URI (я также могу использовать его непосредственно для GetAsync - тот же результат), и моя закодированная строка Uri стала преобразованной в некодированную версию после создания System.URI-объект («% 2F» заменен на «/», «% 2E» на «.» И т. Д.) Или выполнение запроса.
Я нашел некоторую информацию о том, что System.URI некорректно работает таким образом.для .Net Framework ниже 4.5.Не имеет значения, какую версию я выберу в свойствах проекта - она работает так же.Я пытался 4.5, 4.5.1, 4.5.2, 4.6 (с версией 3.5 я не могу скомпилировать библиотеку из-за некоторых пропущенных классов).Также пытался получить версию System.URI во время выполнения внутри моей библиотеки с FileVersionInfo.GetVersionInfo(typeof(Uri).Assembly.Location).ProductVersion
и получить версию 4.7.3416.0 (новую).
Но когда я создал тестовое консольное приложение с .Net версии 3.5 System.Класс URI (старый продукт версии 2.0.50727.8806) работает так же, как в моей библиотеке COM в VBA Editor!После этого я узнал, что для Microsoft Office требуется программное обеспечение .NET Framework версии 3.5 или выше (я использую Office 2013).Похоже, моя надстройка использует системную ссылку приложения MS Office, а не настройки моего проекта.
Я попытался определить псевдоним для системной ссылки в разделе с использованием моего файла библиотеки .cs и использовать этот псевдоним для всей системы.* классы внутри него - результат тот же.Также пытался проверить некоторые настройки ссылок для ссылки на систему, такие как «Копировать локальный» и «Вставить типы взаимодействия» - ничего не меняется.
Uri testuri = new Uri("http://testuri/TestWbk%2FModule1%2Ebas");
.NET Framework 3.5 результат:
testuri.AbsoluteUri = "http://testuri/TestWbk/Module1.bas"
.NET Framework 4.5 результат (нужно, чтобы некодированная точка не имела значения):
testuri.AbsoluteUri = "http://testuri/TestWbk%2FModule1.bas"