首页
社区
课程
招聘
[原创]VC6.0MFC调用.net小技巧(非COM接口实现方式)
发表于: 2016-10-24 22:10 5830

[原创]VC6.0MFC调用.net小技巧(非COM接口实现方式)

2016-10-24 22:10
5830
如何在vc6.0的MFC下调用原生 .net2.0或.ne4.0方法呢?
网上大部分人给出的说法是在.net中实现COM接口来实现。

这里给出另一种调用方法(测试稳定可行)
   毕竟大名鼎鼎的vc++6.0出来时,微软的.net还在襁褓之中,不是每个已有的.net的DLL都实现了COM接口。
      很简单,也很有效。可以通过中间的CLR组件生成crl.DLL,vc6mfc.exe->crl.dll->net.dll间接的调用。
vc6肯定支持c的方式调用,CLR配置时选择支持公共语言库,再添加c的导出函数,由vc6调用就可把vc6和.net粘结到一起了。

贴下中间组件CLR部分:

/********************
*vc6调用CLRMethod(*)即可
*
********************/
#include "stdafx.h"

#include "TestCLR.h"

#using "TestNet.dll"//.net库
using namespace TestNet;//.net命名空间

//用于外部主程序调用类的方法  
extern "C" _declspec(dllexport) int CLRMethod(int ports, long speeds, char* filePaths, int fileTypes)
{
        System::Int32 port = ports;
        System::Int64 speed = speeds;
        System::String ^filePath = gcnew System::String(filePaths);
        System::Int32 fileType = fileTypes;
        TestClass ^h = gcnew TestClass();//.net类名
        int ret = h->NetMethod(port, speed, filePath, fileType);//.net方法名称调用与传参
        return ret;
}
*转载请注明来自看雪论坛@PEdiy.com(遭雷劈的家伙路过~~)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 221
活跃值: (2301)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
给个实例,说明一下
2016-10-24 22:23
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
.net core
2016-10-24 22:37
0
雪    币: 159
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
int main()
{
        HRESULT hr = S_OK;
        ICLRMetaHost    *m_pMetaHost = NULL;
        ICLRRuntimeInfo *m_pRuntimeInfo = NULL;
        ICLRRuntimeHost *pClrHost = NULL;

        HMODULE clrmd = LoadLibrary(L"mscoree.dll");
        MyCLRCreateInstance func = (MyCLRCreateInstance)(GetProcAddress(clrmd, "CLRCreateInstance"));

        hr = func(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&m_pMetaHost);

        if (hr != S_OK)
                return hr;
        //cout << "CLR 初始化成功" << endl;
        //OutDebugStr(L"CLR 初始化成功");
        //v2.0.50727
        //v4.0.30319
        hr = m_pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&m_pRuntimeInfo));
        if (hr != S_OK)
                return hr;
        //cout << "载入.net 版本成功" << endl;
        //OutDebugStr(L"载入.net 版本成功");
        hr = m_pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pClrHost));
        if (hr != S_OK)
        {
                return hr;
        }
        //这个貌似没必要主动调用了, 2.0还是要的. 4.0虽然没必要.但调用一下无妨
        hr = pClrHost->Start();
        //if (hr != S_OK)
        //{
        //        return hr;
        //}
        //cout << "开启接口 载入运行" << endl;
        //OutDebugStr(L"开启接口 载入运行");
        DWORD dwRet = 0;

        //TCHAR szPathTemp[512];
        //GetModuleFileName(NULL, szPathTemp, 512);
        //运行
        hr = pClrHost->ExecuteInDefaultAppDomain(L"SampleManagedApp.exe",  
                                                 L"Test.Run",   
                                                 L"Test",  
                                                 L"Hello World!",  
                                                 &dwRet);  

        if (hr != S_OK)
        {
                //OutDebugStr(hr);
        }

        //不打算停止释放. 如果成全局.那就可以互相调用了
        //hr = pClrHost->Stop();
        //pClrHost->Release();
        //OutDebugStr(L"CLR 释放完毕 卸载DLL");
        FreeLibrary(clrmd);
        //OutDebugStr(L"Dome完毕");
    return 0;
}

手工开启clr调用函数并传参.
有点烂大街的说法.

PS:
楼主这种语法是要开启clr的吧.
vc6 支持c++/clr 这种语法? 如果不支持能编译通过?
印象中vc6 没有clr才对吧? 印象..

PS2:
看懂了 = =
楼主这是用clr来编译一个dll.
然后vc6再通过这个dll来执行.net的方法
vc6->c++/clr.dll->.net.dll
然而直接通过c++启动clr调用.net.dll最为方便了.
中间不用通过一个c++/clr.dll来中转
2016-10-25 11:41
0
游客
登录 | 注册 方可回帖
返回
//