Сборка сборки из другого домена приложения

Можно ли хранить ссылку на сборку из другого домена приложения без загрузки этой сборки в текущий домен приложения?

Я работаю над исправлением утечки памяти в службе Windows, которая динамически генерирует сборки и запускает динамически сгенерированный код. Проблема в том, что сгенерированные сборки загружаются в текущий домен приложения и никогда не могут быть выгружены.

В одной из библиотек служб Windows есть метод со следующей подписью:

public Assembly CreateMethod(ObservableCollection<Field> sourceFields, Field destinationField)

Этот метод создает код для сборки и загружает его с помощью функции LoadMethod библиотеки CSScript:

result = CSScript.LoadMethod(scriptFunction.ToString());

Позже эта ссылка на сборку из CreateMethod используется для запуска функции внутри созданной сборки.

public object Run(Field destinationField, ObservableCollection<LinkField> sourceLinkFields, DataRow mainRow, Assembly script) {

   ...

   var method = script.GetStaticMethodWithArgs("*.a" + Id.ToString().Replace("-", String.Empty), argumentTypes.ToArray());

   return method(arguments.ToArray());
}

Мне интересно, можно ли загрузить динамически сгенерированную сборку в другой домен приложения и запустить их через какой-то прокси-сервер, не загружая его в текущий домен приложения.

Изменить:

Я хочу знать, могу ли я использовать Assembly ссылку на класс в одном домене приложений, когда сборка загружается в другой домен приложений. В документации MSDN показано, как использовать MarshalByRefObject. В основном я пытаюсь избежать изменения подписи моей функции CreateMethod, однако мне может потребоваться изменить ее, чтобы вернуть MarshalByRefObject, если это невозможно.

Обновление:

В итоге я поместил вызов CSScript.LoadMethod в другой домен приложения, где я храню словарь. Затем я заставил CreateMethod возвращать Guid вместо Assembly, а затем я передаю этот Guid до вызова Run. Вызов Run теперь принимает Guid в качестве аргумента вместо Assembly. Внутри вызова Run я передаю Guid другому домену приложения, запускаю метод и возвращаю объект результата через класс, наследующий MarshalByRefObject.


person dmck    schedule 14.10.2011    source источник
comment
См., Например: stackoverflow.com/questions/ 88717 /   -  person DeCaf    schedule 14.10.2011


Ответы (2)


Если вам не нужна динамическая сборка в вашем основном домене приложений, вам нужно переместить CreateMethod в другой домен приложений, потому что как только у вас есть экземпляр Assembly, он загружается. Другими словами, невозможно удерживать ссылку на сборку в другом домене приложения, только для вызова этой сборки в доменах приложений.

Не меняя подпись и кучу кода, похоже, нужно переместить минимальную сумму: 1) создание сборки и 2) Run. Затем выполните Run сортировку результатов.

Что касается CreateMethod, я думаю, вы хотите, чтобы метод в другой сборке «оборачивал» CreateMethod и возвращал какой-то токен, который можно передать в Run. Это почти как изменить подпись в некотором роде ...

person Kit    schedule 14.10.2011
comment
Спасибо, я выбрал именно такой подход. Мне пришлось изменить сигнатуры методов CreateMethod и Run, но я все же смог сохранить исходный дизайн кода. - person dmck; 15.10.2011

Это одна из основных функций AppDomain! Просто посмотрите документацию

person John Saunders    schedule 14.10.2011
comment
Спасибо за ссылку, я обновил вопрос, добавив некоторые дополнительные сведения. Мне все еще не ясно, нужно ли мне изменить подпись CreateMethod на MarshalByRefObject или я могу сохранить возвращаемый тип как Assembly - person dmck; 14.10.2011
comment
В интересах помощи другим в будущем я хотел бы знать: просматривали ли вы ранее документацию для AppDomain? - person John Saunders; 15.10.2011