Обеспечивают ли домены приложений .Net защиту от вредоносных библиотек C?

#c# #c #multithreading #appdomain

#c# #c #многопоточность #appdomain

Вопрос:

У меня есть библиотека C, которая не является потокобезопасной — и, вероятно, никогда не будет. Я вызываю его из C # с помощью PInvoke, и это работает довольно хорошо.

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

Будут ли домены приложений изолировать беспорядок кода C (глобальные переменные и т. Д.) Друг от друга или нет? Если нет, то что будет?

Комментарии:

1. Можно ли загружать библиотеку несколько раз в C #, как вы можете в C / C , копируя оригинал и динамически загружая его снова? Дешевый, но эффективный способ обойти это!

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

Ответ №1:

Нет, домены приложений не помогут. Если вы одновременно вызываете свою библиотеку C, не имеет значения, из какого домена приложения поступают вызовы.

Если библиотека C не является потокобезопасной, вам придется сериализовать доступ к ней. На самом деле, наличие нескольких доменов приложений усложняет задачу — вам придется синхронизировать между доменами.

Ответ №2:

Я думаю, что AppDomains — это конструкция, которая изолирует только управляемый код.

Вам необходимо синхронизировать доступ к вашей библиотеке c с доступными примитивами синхронизации c # / .NET (например, использовать lock блоки).

Ответ №3:

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