Как безопасно размещать плагины с помощью .NET 2.0 - PullRequest
6 голосов
/ 25 марта 2011

Я пишу игру в шахматы, которая позволяет двум программам конкурировать, игрок должен написать DLL и предоставить функцию, чтобы сообщить основному приложению, куда его игрок двинется дальше, предположим, что функция выглядит следующим образом

public static void MoveNext(out int x, out int y, out int discKind);

DLL игрока может быть написана с использованием C # или C ++.

В приложении для игры в шахматы я запускаю новый поток для вызова функции, которую DLL-библиотека игрока открыла, чтобы получить то, где онбудет двигаться по очереди, и я запускаю таймер, чтобы предотвратить тайм-ауты игрока. Если тайм-аут игрока, я убью соответствующий поток, следуя API

thread.Abort();
thread.Join();

У меня есть следующие проблемы, как описано ниже:

  1. Нить не может быть уничтожена со 100% гарантией (это зависит от кода игрока)

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

Существуют ли какие-либо методы, идеи или методы, которые могут решить вышеуказанные проблемы?

Из этого CodeInChaos предлагается загрузить DLL проигрывателя в отдельный домен, а затем выгрузить его при необходимости, я не уверен, что он все еще работает для неуправляемой DLL (C ++) а если это приведет к низкой эффективности?

Ответы [ 2 ]

8 голосов
/ 25 марта 2011

Необработанное исключение в их домене приложений все равно приведет к завершению работы вашей программы в .Net 2.0. Вы получаете возможность ответить на исключение через обработчик событий, но не можете его обработать.

Лучше всего использовать процессы для той изоляции, которую вы ищете.

4 голосов
/ 04 апреля 2011

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

Это тогда дает вам возможность перехватывать необработанные исключения в этом конкретном домене приложения , и тогда у вас есть возможность Выгрузка всего домена приложения. Таким образом, вы можете справиться с неправильным поведением и выбросом исключений из плагинов приложений других людей. вы также получаете возможность указать частичное доверие, чтобы дополнительно ограничить возможности плагина.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...