Можно ли хранить ссылку на сборку из другого домена приложения без загрузки этой сборки в текущий домен приложения?
Я работаю над исправлением утечки памяти в службе 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.