gpt4 book ai didi

c# - 几个 AppDomains 和 native 代码

转载 作者:可可西里 更新时间:2023-11-01 08:40:39 25 4
gpt4 key购买 nike

我的 C# 应用程序使用非线程安全的 native 代码。

我可以运行该本地代码的多个进程,使用进程间通信来实现并发。

我的问题是,我是否可以改用 App Domains,以便多个托管线程(每个线程位于不同的 App Domain 上)调用 native 代码并且它们不会相互干扰?

主要目标是防止进程分离。

最佳答案

不,AppDomains 是一个纯粹的托管代码概念。它通过将托管对象根分开来实现隔离。一个 AppDomain 看不到另一个 AppDomain 的对象,这使得中止代码和卸载程序集变得非常安全。绝非偶然,它会丢弃所有可能包含状态的数据。

非托管代码完全不知道 GC 堆和 AppDomains,它将在其数据部分和它自己的 native 堆 (HeapAlloc) 中进行分配。这种分配是进程全局的。这使得进程成为隔离边界,您需要一个辅助进程来加载 DLL 并使用 .NET 进程互操作机制(套接字、命名管道、内存映射文件、远程处理、WCF)之一与其对话。

从技术上讲,您可以创建 DLL 的副本,每个副本具有不同的名称。但这扩展性非常差,而且 pinvoke 非常笨拙,因为您不能再使用 [DllImport]。您需要每个导出函数的委托(delegate)声明以及 LoadLibrary() 和 GetProcAddress() 来初始化委托(delegate)对象。

关于c# - 几个 AppDomains 和 native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23367079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com