我的 C# 应用程序使用的本机代码不是线程安全的。
我可以运行该本机代码的多个进程,使用进程间通信来实现并发。
我的问题是,我可以使用应用程序域来代替,以便多个托管线程(每个线程位于不同的应用程序域上)调用本机代码并且它们不会相互干扰吗?
主要目标是防止进程分离。
不,AppDomains 是一个纯粹的托管代码概念。它通过保持被管理对象根的分离来实现隔离。一个 AppDomain 无法看到另一个 AppDomain 的对象,这使得中止代码和卸载程序集变得非常安全。绝非偶然,它会丢弃所有可能包含状态的数据。
非托管代码完全不知道 GC 堆,因此 AppDomains 会在其数据部分和自己的本机堆 (HeapAlloc) 中进行分配。这种分配是进程全局的。这使得进程成为隔离边界,您需要一个辅助进程来加载 DLL 并使用 .NET 进程互操作机制之一(套接字、命名管道、内存映射文件、远程处理、WCF)与其进行通信。
从技术上讲,您可以创建 DLL 的副本,每个副本都有不同的名称。但它的扩展性非常差,并且 pinvoke 非常尴尬,因为您不能再使用 [DllImport]。您需要为每个导出函数提供委托声明,并需要 LoadLibrary() 和 GetProcAddress() 来初始化委托对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)