吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 495|回复: 1
收起左侧

[经验求助] 请问有什么工具可以将C#库嵌入到已有的第三方C++库上

[复制链接]
Roc_Chen 发表于 2025-4-19 06:36
25吾爱币
我有一个自己用C#编写的DLL文件,我想把我编写DLL文件与原有的C++的DLL合并或者让原有的DLL在被调用后,再调用我的,有什么方法可以实现

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

abaooo 发表于 2025-4-19 09:18
gpt思路:✅ 方案一:C++ DLL 调用 C# DLL(推荐方式)
虽然 C# 生成的是托管代码(Managed DLL),C++ DLL 是非托管代码(Unmanaged DLL),但你可以通过 COM 或 C++/CLI 进行桥接调用。

🔹 方法 1:通过 COM 接口调用 C# DLL(传统、稳定)
将你的 C# 类库项目设置为 COM 可见

打开 AssemblyInfo.cs 添加:

csharp
复制
编辑
[assembly: ComVisible(true)]
在 C# 的类或接口上添加:

csharp
复制
编辑
[ComVisible(true)]
[Guid("YOUR-GUID-HERE")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IMyInterface
{
    void DoSomething();
}

[ComVisible(true)]
[Guid("YOUR-CLASS-GUID-HERE")]
[ClassInterface(ClassInterfaceType.None)]
public class MyClass : IMyInterface
{
    public void DoSomething()
    {
        // Your logic here
    }
}
注册你的 DLL

使用 regasm MyCSharpDll.dll /codebase 注册 DLL。

或者更保险地加上 /tlb 生成类型库:

bash
复制
编辑
regasm MyCSharpDll.dll /codebase /tlb
C++ 中调用(通过 COM)

使用 CoCreateInstance 实例化你的类,并调用其方法。

🔹 方法 2:使用 C++/CLI 包装你的 C# DLL(中间桥接)
创建一个 C++/CLI 项目,引用你的 C# DLL。

在 C++/CLI 中定义 extern "C" 函数接口供原生 C++ DLL 调用。

在这些函数中再调用 C# 的方法。

优点:更现代,更灵活;无需注册 COM,适合嵌入式或私有项目。

✅ 方案二:让原有 C++ DLL 中调用你新增的 DLL(钩子式调用)
如果你无法或不想修改原始 DLL 的源码,有以下技巧:

🔹 方法 1:使用函数重定向或 Hook 技术
你可以用以下方式让原来的 DLL 自动调用你的:

修改 C++ DLL 导出函数,在函数内部调用你的 C# 方法(通过 C++/CLI 或 COM)。

使用工具(如 Microsoft Detours、EasyHook)Hook 原始 DLL 的函数调用,然后在其中调用你的逻辑。

🔹 方法 2:封装一个新的 DLL,将原始 DLL 和你的逻辑打包
创建一个新的 C++ DLL,导出跟原始 DLL 相同的函数。

在每个函数内部:

先调用你自己的逻辑(C# 方法)。

然后调用原始 DLL 的对应函数(通过 LoadLibrary 和 GetProcAddress)。

最终用户调用的是你这个新的“代理 DLL”。

🧠 实例结构(代理式 DLL 示例):
cpp
复制
编辑
// newdll.cpp
typedef void (*OrigFuncType)(int);
OrigFuncType originalFunc = nullptr;

extern "C" __declspec(dllexport) void DoWork(int value)
{
    // 1. 调用 C# 方法
    CallManagedMethod(value);  // 来自 C++/CLI or COM

    // 2. 调用原 DLL 方法
    if (originalFunc)
        originalFunc(value);
}
✅ 总结推荐路径:

目标        推荐方法
原 DLL 源码可修改        直接在原 DLL 中通过 COM 或 C++/CLI 调用 C#
原 DLL 不可改,但你控制 DLL 加载        写一个代理 DLL 重定向调用并添加 C#
高级定制        使用 Hook 技术(如 Detours)插入调用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-17 17:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表