Короче говоря, я хочу загрузить файл .DLL во время выполнения и попросить его изменить значение ref, которое я передал ему в качестве параметра. (.DLL будет написан на C #), но я не знаю, какой будет подходящий метод.
У меня есть класс "ALotOfData", который содержит ~ 1 гигабайт переменных.
Я хочу динамически загрузить файл .DLL, содержащий метод
"DoWork (ref ALotOfData thedata) {thedata.value = ...}
затем выполните метод, а затем выгрузите DLL и сделайте то же самое с другой DLL. (ОЧЕНЬ важно иметь возможность загружать / выгружать библиотеки DLL во время выполнения)
Очевидно, решением было бы передать копию самого значения, вернуть измененную копию и вернуть ее в мой класс.
Однако это невозможно, если DLL-файлу придется принимать решение. на основе данных, какие данные следует изменить (учтите: потенциально требуется доступ ко всем данным).
Простое копирование всего пакета данных - это ... абсолютно ужасная идея, поскольку все данные имеют размер около 1 гигабайта.
Как я могу импортировать метод из .DLL динамически (во время выполнения) и передать ему параметр по ссылке, я имею в виду, фактически передать ссылку, а не просто скопировать ее? (очень важно передать реф в класс без копирования)
Псевдокод может помочь объяснить мою точку зрения:
class ALotOfData{ ... } // ~ about 1GB of initialized values inside
Main(){
DLL = loadDLL("mydll.dll");
DLL.Invoke("DoWork",ref AlotOfData); // This needs to actually change my class's contents
DLL.unload();
}
Внутри dll:
DoWork(ref ALotOfData data){
if(data.value){
foreach( value A in data.value ){ ... } // ~100 iterations
}
}
Я мог бы добавить это решение в свою основную программу, но это лишило бы возможности загружать / выгружать файлы DLL.
ref
не требует копирования ... Рассмотрите возможность предоставления небольшого образца кода, который показывает вашу проблему. Я подозреваю, что часть загружаемой библиотеки DLL на самом деле не важна для проблемы, и вы сможете показать ее с помощью простых классов / отражений. (пример кода для работы сref
находится в stackoverflow.com/questions/2304745/). - person Alexei Levenkov   schedule 25.06.2015ALotOfData
должны быть сериализованы через границы домена приложений, что означает вы всегда будете получать некоторую копию данных в целевой сборке. - person James Thorpe   schedule 25.06.2015