【发布时间】:2021-08-26 03:23:31
【问题描述】:
为了正确起见,如果我对 C# 程序以委托作为参数调用 C++ dll 之间的数据流的想象正确,我想听听你的意见。
- 系统为 C# 程序提供内存
- C# 程序加载 .dll 并将其部分空间分配给 C++ dll。在这个空间中不会有 C# 垃圾收集,只有在卸载 .dll 之后才能释放整个空间。
- 调用了 C++ 函数。特定的 Function 有一个委托作为参数。我们深入 C++ 内存区域并声明一些变量。 C++ 函数将在其代码中的某处调用 C# 委托。
- C# 委托在 C# 内存上运行,如果输入参数是本机类型,则 C# 委托将在 C# 内存中保存一份副本,或者如果它是复杂类型,则引用 C++ 内存中的变量。如果我们有本机类型,我可以将其保存到 C# 世界中,一切都会好起来的。但是,如果它是一个引用并且我只是将它保存到我的 C# 内存中,如果我结束我的 C++ 函数,我将得到未定义的行为,因为变量将超出范围并被销毁。
- C#函数结束,我们得到C++中的返回值作为副本(或者返回值的指针,如果是复杂类型,指针将指向C#内存)
- C++函数结束,C++函数使用的内存被释放
我说得对吗?
【问题讨论】:
-
每个问题一个个问题。
标签: c# c++ memory-management dll