多个 AppDomain 和本机代码

2023-12-29

我的 C# 应用程序使用的本机代码不是线程安全的。

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

我的问题是,我可以使用应用程序域来代替,以便多个托管线程(每个线程位于不同的应用程序域上)调用本机代码并且它们不会相互干扰吗?

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


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个 AppDomain 和本机代码 的相关文章

随机推荐

  • 使用IoC时单元测试的策略应该是什么?

    在读完有关依赖注入和 IoC 的所有内容后 我决定尝试在我们的应用程序中使用 Windsor Container 它是一个 50K LOC 多层 Web 应用程序 所以我希望它不是一个矫枉过正的东西 我使用了一个简单的静态类来包装容器 并在
  • 修复我的网络活动指示器

    我的网络活动指示器有一个问题 有时它会在不应该显示的情况下继续显示 我为它编写了自己的管理器 并将其替换为使用NSAssert像这样的声明 void setNetworkActivityIndicatorVisible BOOL setVi
  • 如何在 Eclipse 中的 Android 库项目中引用外部 jar

    哦 安卓 我多么喜欢你的言辞 我有一个工作区 里面有一些项目 App1和App2是Android应用程序 Common是一个Android库项目 App1 和 App2 依赖于 Common 通过 Android 选项卡链接 Common
  • 更新命令行应用程序状态

    我有一个命令行应用程序 当前打印增加的百分比 1 2 3 4 输出是连续的 但我见过命令行工具显示更改 就好像它是内联更新一样 1 2 与第一个位置相同 3 与第一个位置相同 4 与第一个位置相同 我怎样才能做到这一点 我正在使用 Java
  • 将 3 列文件转换为矩阵格式

    我有一个如下例所示的文件格式 显示了 5 个人 包括他们自己 之间的关系 1 1 1 0 2 1 0 5 3 1 0 1 4 1 0 3 5 1 0 1 2 2 1 0 3 2 0 5 4 2 0 2 5 2 0 3 3 3 1 0 4 3
  • 静态属性和单例有什么区别?

    使用 C 实现的单例可能类似于 public class Singleton private static Singleton instance private Singleton public static Singleton Insta
  • 如何使用 NSUserDefaults 注册用户默认值而不覆盖现有值?

    我有一个 AppDelegate 类 void initialize我用来注册一些默认值的方法 这是我使用的代码 void initialize NSDictionary defaults NSDictionary dictionaryWi
  • 可移植的有符号/无符号字节转换,C++

    我正在使用有符号到无符号字节 int8 t 转换来打包字节 uint32 t uint8 t byte lt lt n 这可以在 Intel Linux 上使用 GCC 运行 对于其他平台 编译器 例如 PowerPC 是否可移植 有更好的
  • JavaFX:使用自定义节点作为 TreeView 的折叠/展开分支开关

    是否可以替换a的展开和折叠箭头TreeView与定制Node 形状 而不是image https stackoverflow com q 15521806 1725096 The fx shape箭头的 css 属性提供了基本的 SVG 形
  • 我如何 - 长轮询和调度程序?

    我正在尝试安排一个长轮询机制 我想知道是否可以利用调度程序来实现这一点 到目前为止 这就是我一直在想的 通过计时器进行调度 但仅在上一次迭代已经完成的情况下才将下一次迭代排入队列 当上一次迭代完成时 将下一次迭代排入队列 我一直在查看现有的
  • 检测图像中的图案并检索其位置

    我有一张 1920x1080 的图像 我需要获取图像中每个矩形的位置 最好为 2 个点 左上 右下 我对 Python 还很陌生 我想也许使用 opencv 模块 但如果你能给我一些指示 那将会非常有帮助 Thanks 我建议使用OpenC
  • 如何在不安装Python Egg文件的情况下直接运行它们?

    是否可以像使用 Java 运行 jar 文件一样直接运行 Python Egg 文件 例如 使用 Java 您可能会执行以下操作 java jar jar file A 蟒蛇蛋 http peak telecommunity com Dev
  • C# 按原始顺序获取 FieldInfos/PropertyInfos?

    如何按照它们在类中的排列顺序获取类型 FieldInfos PropertyInfos 作为 MemberInfo 数组 class Test public bool First get set public int Second publ
  • 如何使新的 numpy 数组与给定数组大小相同并用标量值填充它

    我有一个带有一些随机数的 numpy 数组 如何创建一个具有相同大小的新数组并用单个值填充它 我有以下代码 A np array 2 2 2 2 B np copy A B B fill 1 我想要一个与 A 大小相同但填充 1 的新数组
  • 在 Oracle 中通过 SELECT 查询声明变量并设置其值

    在 SQL Server 中我们可以使用这个 DECLARE variable INT SELECT variable mycolumn from myTable 我怎样才能在 Oracle 中做同样的事情 我目前正在尝试以下操作 DECL
  • 使用 bookworm 在 Docker 中为 PHP8.1 添加 Memcached 支持时出现问题

    我有一个Dockerfile依靠PHP 8 1 apache 运行了几个月 Once PHP 8 1 apache开始使用 Debian bookworm memcached 客户端在构建镜像时开始出错 The Dockerfile涉及的行
  • 如何制作八角形盒子?

    我想使用 CSS 创建下面给出的框 我进行了很多搜索并阅读了非常好的文章 例如https css tricks com examples ShapesOfCSS https css tricks com examples ShapesOfC
  • 表示连续概率分布

    我有一个涉及连续概率分布函数集合的问题 其中大部分是根据经验确定的 例如出发时间 过境时间 我需要的是某种方法来获取其中两个 PDF 并对它们进行算术运算 例如 如果我有两个值 x 取自 PDF X y 取自 PDF Y 我需要获取 x y
  • $locationChangeSuccess 触发四次

    我是 Angular Js 的新手 我的申请流程如下 1 我有一个视图控制器 其中每个视图控制器在面包屑工厂的帮助下设置面包屑数据 2 面包屑工厂从视图控制器获取数据并将数据附加到 location state 对象 存储在状态对象中的原因
  • 多个 AppDomain 和本机代码

    我的 C 应用程序使用的本机代码不是线程安全的 我可以运行该本机代码的多个进程 使用进程间通信来实现并发 我的问题是 我可以使用应用程序域来代替 以便多个托管线程 每个线程位于不同的应用程序域上 调用本机代码并且它们不会相互干扰吗 主要目标