gpt4 book ai didi

c# - native C++ 通过代理 C++ 管理的 dll 使用 C# dll

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:12 26 4
gpt4 key购买 nike

这很复杂,所以请耐心等待。我有一个用 native (仅限 Win32)C++ 编码的第三方程序(“目标”)。作为目标设计的一部分,它实现了一个 dll 插件系统。当放置在程序的“ext”目录中时, native DLL 由目标加载。然后目标调用每个 DLL 提供的四种方法(Initialize、SendHook、RecvHook、Terminate)。您可能已经从函数名称中猜到了,加载项会 Hook 目标中的某些函数。我没有目标的源代码。

其中一个加载项陈旧且存在错误 - 更不用说令人困惑且相当丑陋了。它是用 Delphi 编写的(当然是编译为 win32 DLL)。在过去的几周里,我一直在增强插件并将其转换为 C#(我将其称为“扩展”)。现在已经完成,所以我将注意力转移到让目标加载扩展(作为类库构建)。

显然,目标( native C++)无法直接加载扩展(托管 C#)。因此,在研究之后,我似乎只需要一个“代理”DLL(用 VC++ 编写并支持 CLR)来加载我的扩展,然后负责将方法调用从目标传递到扩展。

“简单。”是的,对。我现在比一袋彩虹糖中的变色龙还要困惑。我已经看到有关使用 COM 的内容,这显然是我需要避免的,无论是在性能还是进程内存权限方面,因为扩展将调用一些方法(通过句柄传递给代理)。此外,我还看到了有关 tlb 和 #import 指令的内容。这似乎也不是正确的方法。

我看到了这篇文章 https://sites.google.com/site/srinivasnzd/csincppviacpp-cli这似乎终于走上了正确的轨道。事实上,我可以很好地从 C++ 代理调用我的托管 C#。作为奖励,似乎(我还不能用实际目标测试它)__declspec(dllexport) 函数可以适本地调用它们的托管对应项代理。但现在问题开始浮出水面。

  • 纯 native 进程可以加载支持 CLR 的 DLL 吗?我见过有人谈论本质上是从支持 CLR 的代码中创建静态库,然后将其与纯 native 代码链接到“部分托管、部分 native ”代理 DLL。但就在那时,我开始感到困惑,我不确定这个话题是否适用于我正在尝试做的事情。
  • 如何将 DWORD 地址编码为 IntPtr(然后在 C# 端将其解码为函数指针)
  • 我看到有人提到 AppDomains。这是我需要担心的事情吗?
  • 我假设我的代理 DLL 需要在同一文件夹中有托管扩展 DLL 才能运行。我是否需要做任何特殊的事情来加载它,或者 CLR 和链接器会处理它吗?
  • 除了输出 DLL 之外,我还得到扩展名为“.exp”、“.ilk”和“.lib”的文件。我假设这些用于静态链接,我可以在使用 DLL 时忽略它们?

最佳答案

看看这个template在不使用 C++ 包装器的情况下借助一些帮助导出 C# 代码。
不幸的是,没有开箱即用的 DllExport 属性,因此您需要一个 C++ 包装器,或者您需要修改 IL 代码以执行导出。
编码地址没有问题,只是要小心 C# 端的函数指针,因为您始终需要确保有一个引用以使它们远离 GC 收集器。如果您保留静态引用,这是最简单的 - GC 看不到对非托管代码中函数指针的引用,因此它可能会清理它。
如果您有多个 C# 模块,应用程序域会很重要 - 如果这些模块共享相同的代码,这将成为一个更大的问题。
exp 来自链接器,ilk 和 lib 与链接器有关,因此我希望您不需要复制它们,但在调试时可能需要它们。

关于c# - native C++ 通过代理 C++ 管理的 dll 使用 C# dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287767/

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