您的位置:首页 > 编程语言 > C语言/C++

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

2017-10-11 11:55 686 查看
           近期,在进行一个大项目开发。其中涉及多语言协同开发。主要是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);

       
...



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

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息