利用c#实现dll动态库,并在c++中调用的方法

           近期,在进行一个大项目开发。其中涉及多语言协同开发。主要是c#dll和c++dll的开发和应用,其中,需要在c++中调用c#dll的内容。现在把开发中的经验、教训和注意事项总结整理如下,希望对其他人能有所帮助。

          1.创建c#dll,选择属性“生成”,勾选上”输出"的"为com的互操作注册"。这样生成dll的时候,自动生成了相应的tlb文件供c++dll库使用。

          2.创建接口声明类,并且在其中定义接口方法,注意需要的[DispId(1)]中序号的递增。

    //接口声明     
    [Guid("50002E5B-1466-42EA-BD84-CC354C6FE141")]
    public interface ComInteropInterface
    {
        /// <summary>
        ///测试
        /// </summary>
        /// <param name="szTipInfo">提示信息</param>
        /// <returns>1表示测试成功,-1表示一种情况失败,-2表示....</returns>
        [DispId(1)]
        int Test(int nFlag);

     }

     3.创建接口实现类

 [Guid("21434AD8-0F73-4950-8A97-521209D6D011")]
 [ClassInterface(ClassInterfaceType.None)]
 public class jgTestComInterop : ServicedComponent, ComInteropInterface

 {

        /// <summary>
        ///测试
        /// </summary>
        /// <param name="szTipInfo">提示信息</param>
        /// <returns>1表示测试成功,-1表示一种情况失败,-2表示....</returns>
       public  int Test(int nFlag)

{

int nRet = 1;

               ....

               return nRet;

  }

}

4.编译生成对应的dll和tlb文件。

5.创建一个c++dll,选择“属性”,将"配置属性"中的"c/c++"的“多处理器编译”设置为false。

6.在c++的实现中,导入对应的tlb文件。如下

#import "Debug//Test.tlb"  

调用实现代码如下:

Test::ComInteropInterfacePtr   ptrTest;  

HRESULT hr;
hr = ptrTest.CreateInstance(__uuidof (Test::jgTestComInterop ));     
if(hr == S_OK)     
{     
lRet = ptrTest->Test(1);

       
...

总结整理自己的经验和教训,可以让自己提高,避免下次犯同样的错误,调理更清楚,另外,也可以给初学者提供一个学习和使用的帮助。抛砖引玉,希望得到大家的指点和交流。



     

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是详细步骤: 1. 创建一个 C++DLL 项目,实现一个简单的加法函数,例如: ```c++ extern "C" __declspec(dllexport) int add(int a, int b) { return a + b; } ``` 2. 在 C++ 项目的属性,选择“生成”选项卡,将“配置类型”设置为“动态库(.dll)”。 3. 创建一个 C++/CLI 的 Class Library 项目,用于封装 C++ DLL 的函数。在此项目,创建一个 public ref class,包含一个 public 的方法,用于调用 C++ DLL 的加法函数。例如: ```c++ #pragma once using namespace System; namespace MyLibrary { public ref class MyMath { public: static int Add(int a, int b) { return add(a, b); } }; } ``` 4. 在 C++/CLI 项目的属性,选择“常规”选项卡,将“目标框架”设置为“.NET Framework 4.x”或更高版本。 5. 在 C++/CLI 项目,添加对 C++ DLL 的引用。在“解决方案资源管理器”,右键单击“引用”,选择“添加引用”,然后选择“浏览”选项卡,找到 C++ DLL 的位置并添加它。 6. 在 C++/CLI 项目,添加对 System.Runtime.InteropServices 的引用。在“解决方案资源管理器”,右键单击“引用”,选择“添加引用”,然后选择“程序集”选项卡,找到 System.Runtime.InteropServices 并添加它。 7. 在 C++/CLI 项目,在 MyMath 类的头文件,添加以下代码: ```c++ [DllImport("MyCppDll.dll", CallingConvention = CallingConvention.Cdecl)] extern int add(int a, int b); ``` 这将告诉 C++/CLI 项目需要使用 C++ DLL 的 add 函数。 8. 在 C++/CLI 项目,编译并运行代码,调用 MyMath 类的 Add 方法,如下所示: ```c++ int result = MyLibrary::MyMath::Add(1, 2); Console::WriteLine(result); // 输出:3 ``` 这样就完成了通过 C++/CLI 调用 C++ DLL 的过程,并且实现了一个简单的加法操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余山水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值