Загрузка 2 версий блока во времени выполнения

Ну, при использовании суда, можно просто записать целое число непосредственно в него, как в

std::cout << text << i;

C++, который способ преобразовать все виды объектов к строкам до строковые потоки . Если у Вас нет одного удобного, просто создайте тот.

#include 

std::ostringstream oss;
oss << text << i;
std::cout << oss.str();

, С другой стороны, можно просто преобразовать целое число и добавить его к строке.

oss << i;
text += oss.str();

Наконец, библиотеки Boost обеспечивают boost::lexical_cast , который переносит stringstream преобразование с синтаксисом как встроенные броски типа.

#include 

text += boost::lexical_cast(i);

Это также работает наоборот, т.е. проанализировать строки.

6
задан Diligent Key Presser 2 December 2014 в 03:53
поделиться

3 ответа

Помимо отличного совета Джонатана Аллена, более «классический» способ решения проблемы - это загрузка 2 версий в 2 разных AppDomanis. Затем вы можете использовать .NET Remoting, чтобы установить связь между двумя доменами приложений. Итак, ZA должен создать новый Appdomain, Load в этом AppDomain ZB и вызвать некоторую операцию в ZB через Remoting.

Обратите внимание, что .NET Remoting предъявляет некоторые требования к классам, которые вы хотите использовать (наследование от MarshalByRef), и создание Домен приложений - дорогостоящая операция.

Надеюсь на помощь

1
ответ дан 17 December 2019 в 07:07
поделиться
    m_Assembly1 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "Old Version\Some.dll"))
    m_Assembly2 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "New Version\Some.dll"))

    Console.WriteLine("Old Version: " & m_Assembly1.GetName.Version.ToString)
    Console.WriteLine("New Version: " & m_Assembly2.GetName.Version.ToString)

    m_OldObject = m_Assembly1.CreateInstance("FullClassName")
    m_NewObject = m_Assembly2.CreateInstance("FullClassName")

С этого момента я использовал позднее связывание и / или отражение для запуска моих тестов.

.NET: загрузить две версии одной и той же библиотеки DLL

3
ответ дан 17 December 2019 в 07:07
поделиться

У меня было две версии одной сборки, загруженные одновременно. Это произошло по сценарию, как вы описали.

Вам нужно убедить среду выполнения загрузить одну и ту же версию ZC для ZA и ZB. Я нашел два способа сделать это:

  1. Используйте элемент bindingRedirect в вашем файле App.config. Некоторые подробности есть в этом вопросе.
  2. Используйте событие AppDomain.AssemblyResolve. Некоторые подробности есть в этом ответе.

Единственная проблема с AppDomain.AssemblyResolve заключается в том, что оно срабатывает только тогда, когда среда выполнения не может найти запрашиваемую версию. Если обе версии доступны, то вам придется использовать bindingRedirect. Я использовал событие AppDomain.AssemblyResolve, а затем добавил проверку безопасности, которая проверяет, что была загружена правильная версия, просматривая коллекцию ссылающихся сборок сборки. Если это не так, я сообщаю пользователю, что где-то лежит старая версия библиотеки, и говорю, где она находится.

0
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: