2011-03-25 5 views
6

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

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

игрока можно записать с помощью C# или C++.

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

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

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

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

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

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

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

ответ

8

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

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

+0

Не могли бы вы дать мне более подробную информацию о том, как использовать процессы для решения моих проблем? –

+0

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

+0

Вам нужно будет создать вспомогательный процесс хостинга, который запустит среду для добавления, которая зависит от того, что требуется вашему добавлению в модели. Тогда вам понадобится использовать механизм IPC для передачи данных в процесс хостинга и из него. Какой метод вы выберете, будет зависеть от того, сколько данных вам нужно передавать назад и вперед и как часто среди других причин. .Net Remoting и WCF - это два механизма, специфичные для .Net, которые должны сделать это проще. Области общей памяти, именованные каналы и COM - более агностические механизмы языка, которые вы можете использовать, но более сложные и нуждаются в дополнительной работе. – SuperIronBob

4

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

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

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

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

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