vc mfc 调用C# dll

原创 2016年08月31日 14:32:21

最近朋友要求帮忙把一个C#写的dll转化成vc MFC可以调用的dll,原本以为很简单的事情,在百度上找了几天,都没有一个简单的方法。折腾了几天,通过网上找的资料加上自己以往的项目经验,终于做完,以下把步骤记录一下:

1.c#建立一个类库项目,项目名为CSharpToCom

2.把Class1类名改为CSharpClass

3.项目-->添加新项-->选择接口,接口名改为ICSharpInterface

4.修改ICSharpInterface.cs内容为

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace CSharpToCom
{
    [Guid("7CC9E4F5-B560-48fb-98BA-E7A158AB0954")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface ICSharpInterface
    {
        [DispId(1)]
        long MyAdd();


        [DispId(2)]
        long MyMessage(string message);
    }
}

//注意:以上"7CC9E4F5-B560-48fb-98BA-E7A158AB0954"是唯一标志符,可以在vs命令提示符内输入guidgen选择Registry Format来产生

5.修改CSharpClass.cs文件内容为

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace CSharpToCom
{
    [Guid("95982183-533F-40da-9D75-64F7C3C1E7F7")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("CSharpToCom")]
    [ComVisible(true)]
    public class CSharpClass:ICSharpInterface
    {
        public CSharpClass()
        { 
        
        }


        public long MyAdd()
        {
            return 11 + 22;
        }
        public long MyMessage(string message)
        {
            MessageBox.Show(message);
            return 1;
        }
    }
}


//注意:以上"95982183-533F-40da-9D75-64F7C3C1E7F7"是唯一标志符,可以在vs命令提示符内输入guidgen选择Registry Format来产生

6.在项目上鼠标右键--->属性---->应用程序----->程序集信息

选中“使程序集COM可见(M)”


7.在项目上鼠标右键--->添加----->新建项

选择文本文件,修为名字为register_Com.bat

修改内容为:

REM register_Com.bat
REM copy this batch file to the same folder with CSharpToCom.dll
REM execute in elevated (run as administrator) Visual Studio Command Prompt
set REGASM_PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319


%REGASM_PATH%\regasm.exe CSharpToCom.dll /tlb:CSharpToCom.tlb
%REGASM_PATH%\regasm.exe CSharpToCom.dll /regfile
%REGASM_PATH%\regasm.exe CSharpToCom.dll


8.在项目上鼠标右键--->重新生成

生成后在bin\debug下面有CSharpToCom.dll

把register_Com.bat拷到bin\debug下

9.开始--->Visual Studio 命令提示(2010)  ---> 鼠标右键--->以管理员身份运行

在命令提示符切换当前目录到bin\debug,运行register_Com.bat,产生CSharpToCom.reg、CSharpToCom.tlb等文件


10.vc上调用

新建VC MFC 对话框项目,添加Button1按钮。

11. 项目----->类向导--->添加类下拉菜单

 选择 类型库中的MFC类

选择CSharpToCom.tlb 添加类

12.在对话框类的CPP文件里加上

#include "CCSharpInterface.h"


CCSharpInterface g_ICSharpInterface;



BOOL CComTestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();


// 将“关于...”菜单项添加到系统菜单中。


// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);


CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}


// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标


// TODO: 在此添加额外的初始化代码
HRESULT coinit = CoInitialize(NULL);


LPCTSTR lpszProgId = _T("CSharpToCom");


g_ICSharpInterface.CreateDispatch(lpszProgId);





return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


void CComTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
TRACE("%d\r\n",g_ICSharpInterface.MyAdd());
TRACE("%d\r\n",g_ICSharpInterface.MyMessage("abc"));

}

void CComTestDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CoUninitialize();


CDialogEx::OnClose();
}

相关文章推荐

VC++ (MFC)调用 C#生成DLL的方法

参考博客中转载的VC++ (MFC)调用 C#生成DLL的liang'z

VC++ (MFC)调用 C#生成DLL的两种方法

VisualC、Delphi或者VB等编程语言来编写的DLL文件,在编译完成以后,产生DLL文件已经是一个可以直接供计算机使用的二进制文件,而Visual C#生成的DLL不是独立运行的程序,是某...

VC++:创建,调用MFC动态链接库(扩展DLL)

概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类。 仓库的发展史经历了"无库" ---> "静态链接库"  ...

VC++ 调用 C#生成DLL的两种方法

今年在C++调用对方用C#写的DLL时,遇到托管和非托管的问题。      原帖:      http://topic.csdn.net/u/20110916/12/fcf63501-45ef-4...

vc调用c#写的dll

转自:http://www.codeproject.com/csharp/ManagedCOM.asp   Download source - 5.21 Kb ...

使用VC++调用C#封装的DLL库实现Excel文件的操作(不用安装office软件环境)

使用VC++调用C#封装的DLL库实现Excel文件操作(不用安装office环境) 【注】这里只是简单实现了,更详细操作,还有待认真研究。 参考网页: http://support.micro...

C#调用VC的DLL的接口函数参数类型转换

handle---------IntPtr   hwnd-----------IntPtr   char *----------string   int * -----------ref ...
  • F7ANTY
  • F7ANTY
  • 2012年02月23日 21:17
  • 572

VC调用C#的COM组件(DLL)

假设要进行二次开发的程序为 A.exe,要增加的功能使用增加DLL的方法来完成,设为Cdll.DLL,其中含有A、B、C等方法。       其中的方法A要用到C#类库Csharp.DLL中的方法A。...

VC调用C#的COM组件(DLL)笔记

假设要进行二次开发的程序为 A.exe,要增加的功能使用增加DLL的方法来完成,设为Cdll.DLL,其中含有A、B、C等方法。        其中的方法A要用到C#类库Csharp.DLL中的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc mfc 调用C# dll
举报原因:
原因补充:

(最多只允许输入30个字)