VC调用C#生成的类库DLL方法
相关代码与原文地址
/article/Sort_Desktop/other/-06-25/2415.php
VC调用C#生成的类库DLL方法
最新因为工作项目上的需求,VC需要调用C#开发的DLL,本来以为是很简单的事,可实际不是这样,因为C#编译出来的DLL与VC、VB、Delphi等这些工具编译出来的完全不一样,C#生成的DLL不是独立运行的程序,是某个程序的一个部分,只能由所属的程序(Microsoft .NET Framework )调用,Visual C#编译器生成的托管代码虽然也是二进制文件,但不是可以直接供计算机使用的原始代码。
网上搜出来的方法也不尽人意,第一种是:对VC++的环境中进行修改使其支持托管代码。第二种是 :C#生成DLL端编译成COM接口。第一种方法会造成VC崩溃现象 ,但是第二种方法网上说得实在太复杂,什么强命名工具,修改ssemblyInfo.cs文件中用AssemblyKeyFile属性等等。最终结果还是不知VC如何调C#类库。
直接上我使用的方法,也是基于COM的,但方法很简单!!!!:)
C# 工程
新建一个类库,然后在CS文件中导出你想提供给外部的接口,记得在文件最上面加using System.Runtime.InteropServices;
导出接口的代码如下,下面的代码只导出了一个 Start 方法,代码中的GUID不能一样,要不编译会不通过
C# Code 复制内容到剪贴板 namespacecs_com_class { [Guid("a83f8440-340f-45cf-b76c-4d2da0352590")] publicinterfaceICSharpinterface { voidStart(stringstrPluginPath); } [Guid("a83f8440-340f-45cf-b76c-4d2da0352591"),ClassInterface(ClassInterfaceType.None)] publicclassCICSharpinterface:ICSharpinterface { publicCICSharpinterface() { } publicvoidStart(stringstrPluginPath) { MessageBox.Show(strPluginPath,"这是C#接口弹出的"); } } }
再对工程进行两项设置,
图 1
如图1所示,选中 Application选项卡,然后点击 Assembly Information按钮,打开一个对话框,如图2
图 2
将Make assembly COM-Visible复选框 钩选上,点OK按钮。
按图3方法,再选中 Build选项卡,在这里进行一项设置,将 output中的Register for COM interop复选框选中,保存参数设置编译这个C#工程
图 3
最后编译完成,查看生成目录是不是有一个后缀tlb的文件,示例中是cs_com_class.tlb
如果没有,请重新按上面方法进行C#设置,编译
最终C#方面就完成了,是不是很简单。
VC工程调用
//在你需要调用的头文件中引用C#的DLLtlb的文件
#import "cs_com_class.tlb" no_namespace named_guids
调用方法如下
折叠 展开 C/C++ Code 复制内容到剪贴板 ICSharpinterfacePtrm_IPluginManageSharpPtr; int_tmain(intargc,_TCHAR*argv[]) { ::CoInitialize(NULL); m_IPluginManageSharpPtr.CreateInstance(CLSID_CICSharpinterface); m_IPluginManageSharpPtr->Start(_bstr_t("VC传入的值,演示VC调用C#类库")); ::CoUninitialize(); return0; }
VC使用接口很简单,只需要在C#接口名后加上Ptr就是VC可以使用的智能指针,CLSID_CICSharpinterface 也是有规则的相信你能看得出来:)
在无开发环境的电脑上使用C# DLL需要用RegAsm.exe注册,RegAsm.exe aaa.dll类似这样的方法
RegAsm.exe可以在你的开发工具安装目录下搜索得到的。32位使用32位版,64位使用64位版
在此,VC调用C# DLL的方法就介绍完了,是不是很简单啊!!还有不明白的可以下载文章配套代码。