利用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);
...
}
总结整理自己的经验和教训,可以让自己提高,避免下次犯同样的错误,调理更清楚,另外,也可以给初学者提供一个学习和使用的帮助。抛砖引玉,希望得到大家的指点和交流。
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);
...
}
总结整理自己的经验和教训,可以让自己提高,避免下次犯同样的错误,调理更清楚,另外,也可以给初学者提供一个学习和使用的帮助。抛砖引玉,希望得到大家的指点和交流。
相关文章推荐
- C++调用C#的DLL实现方法
- C++调用C#的DLL程序实现方法
- C++调用C#的DLL实现方法
- C# 调用C++写的dll的实现方法
- 如何实现C++调用C#的dll方法教程
- C++调用C#的DLL实现方法
- c# 调用c++带有回调函数方法的实现
- C++与C#编写的DLL/COM的各种调用方法
- com调用的几种方法 及 C#调用C++编写的的COM DLL
- 非托管C++代码调用C#编写的dll方法
- Socket发送消息之c#调用c++DLL方法
- [总结]非托管C++代码调用C#编写的dll方法
- C#调用C++动态库时出错的解决方法
- 转:使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- c# 动态加载dll文件,并实现调用其中的方法
- 巧用C#做中间语言 实现Java调用.net DLL的方法
- 一种实现 Java调用C++的DLL的方法
- C++与C#编写的DLL/COM的各种调用方法
- C#调用C++DLL的方法
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法