2012-06-21 2 views
0

Я хочу, чтобы «горячая» загрузка некоторых предварительно упакованных сборок (ов) в отдельный AppDomain, однако, я не знаю названия класса точки входа или даже файла сборки. Мне нужно найти эту точку входа, чтобы я мог запустить некоторую процедуру инициализации.ReflectionOnlyLoad можно ли собирать мусор?

Так что я намерен сделать это, чтобы запустить ReflectionOnlyLoad во всех файлах и найти тот, который следует за определенным соглашением, т.е. аннотированный/реализует определенный интерфейс и т. д.

Вопрос: должен ли я начать утечку памяти, если бы я снова и снова запускал ReflectionOnlyLoad из основного AppDomain? Если это невозможно запустить из основного домена приложения, каковы мои параметры, потому что снова я не знаю, где находится точка входа.

Также оценивается любая дополнительная информация об тонкостях использования ReflectionOnlyLoad.

+0

По моему опыту ReflectionOnlyLoad очень раздражает работать. Вместо этого я бы посмотрел на «Mono.Cecil». – CodesInChaos

ответ

3

Я рекомендую Mono.Cecil. Это простая сборка, которую вы можете использовать в .net (для нее не требуется время выполнения Mono). Он предлагает API для загрузки сборок в виде данных и работает очень хорошо. Я нашел API удобным для работы, и он не пострадал от тех проблем, которые я испытывал при использовании отражения-только-нагрузки.

Вы также можете использовать CCI, который представляет собой проект с открытым исходным кодом от MS, который предлагает сборщик.

Смотрите также: CCI vs. Mono.Cecil -- advantages and disadvantages

+0

Спасибо, это звучит так, как будто это будет трюк. – Alwyn

1

ReflectionOnlyLoad не решит вашу проблему, см docs

Почему вы не выполнить код для нахождения точки входа и т.д. в новом AppDomain?

+0

Потому что у меня нет конкретного типа. У меня только абстракция. Предполагается, что конкретный тип будет реализован в пакете, но я не знаю, что вызывается редактором. Я не надеюсь, что ReflectionOnlyLoad решит все это, я также намерен использовать MarshallByRefObject. Все, что мне нужно - это получить FullName конкретного типа, чтобы я мог создать экземпляр удаленного объекта. – Alwyn

+1

Если вы можете найти точку входа в AppDomain по умолчанию, вы сможете найти ее, если вы выполните код в другом AppDomain. – Onkelborg

+0

Нет, я не могу найти его. Класс начальной точки не существует в AppDomain по умолчанию. В основном это похоже на возможность запуска какого-либо произвольного кода, если указанный код следует определенному соглашению. – Alwyn

0

Невозможно отразить DLL. Даже с отражением только нагрузки, тип прилипает к основному AppDomain.

2 Решения:

  1. Поместите точку входа в XML-нибудь и разобрать, что.
  2. Используйте 2-этапный AppDomain, один для отражателя, а затем другой для действительного объекта .

Я выбрал (1), так как это самый разумный.

(2) Мне нужно пройти через 2 отдельных прокси, чтобы выдавать команду реальному удаленному объекту, или мне нужно соединить интерфейсы гораздо ближе, чем мне нравится. Не говоря уже о боли в коде.

+0

Вы попробовали Mono.Cecil? – CodesInChaos

+0

Нет, но это похоже на возможное решение. Я просто не был уверен, так как хочу жить строго в мире msft .net, чтобы избежать потенциальных конфликтов. – Alwyn

Смежные вопросы