VcCallC#_02

1、VC代码:(vs2013运行正常)

// ConsoleApplication_CallCS.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

/*
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
//*/

/*
#include <SDKDDKVer.h>

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

#include <metahost.h>
#include <mscoree.h>
#pragma comment(lib, "mscoree.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    ICLRMetaHost        *pMetaHost = nullptr;
    ICLRMetaHostPolicy  *pMetaHostPolicy = nullptr;
    ICLRRuntimeHost     *pRuntimeHost = nullptr;
    ICLRRuntimeInfo     *pRuntimeInfo = nullptr;

    HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
    //hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo));
    hr = pMetaHost->GetRuntime(L"vv2.0.50727", IID_PPV_ARGS(&pRuntimeInfo));

    if (FAILED(hr))
    {
        goto cleanup;
    }

    hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pRuntimeHost));

    hr = pRuntimeHost->Start();

    DWORD dwRet = 0;
    //hr = pRuntimeHost->ExecuteInDefaultAppDomain(L"SampleManagedApp.exe",
    //                                             L"SampleManagedApp.Program",
    //                                             L"Test",
    //                                             L"Hello World!",
    //                                             &dwRet);
    hr = pRuntimeHost->ExecuteInDefaultAppDomain(L"ClassLibrary4VC.dll",
        L"ClassLibrary4VC.ClassLibraryTest01",
        L"ClassLibraryFunc01",
        L"Hello World!",
        &dwRet);

    hr = pRuntimeHost->Stop();

    cleanup:
    if (pRuntimeInfo != nullptr)
    {
        pRuntimeInfo->Release();
        pRuntimeInfo = nullptr;
    }

    if (pRuntimeHost != nullptr)
    {
        pRuntimeHost->Release();
        pRuntimeHost = nullptr;
    }

    if (pMetaHost != nullptr)
    {
        pMetaHost->Release();
        pMetaHost = nullptr;
    }

    system("pause");
}
//*/

//CorBindToRuntimeEx
// https://msdn.microsoft.com/zh-cn/library/99sz37yh.aspx
// http://zhidao.baidu.com/link?url=L2NYvtj82SvXjqn6-Abatd6dyK3VdSta_DZAeqGqoRUCDcsvlXrxK-vnMUXq8RJQLSSSlHY1M6RTWLHTzJJSvcuipSwuhGwkFFCWcZBZpGG
// http://blog.csdn.net/hadstj/article/details/34823905

#include <SDKDDKVer.h>

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

#include <metahost.h>
#include <mscoree.h>
#pragma comment(lib, "mscoree.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    ICLRMetaHost        *pMetaHost = nullptr;
    ICLRMetaHostPolicy  *pMetaHostPolicy = nullptr;
    ICLRRuntimeHost     *pRuntimeHost = nullptr;
    ICLRRuntimeInfo     *pRuntimeInfo = nullptr;

    //HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
    ////hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo));
    //hr = pMetaHost->GetRuntime(L"vv2.0.50727", IID_PPV_ARGS(&pRuntimeInfo));

    //if (FAILED(hr))
    //{
    //    goto cleanup;
    //}

    //hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pRuntimeHost));

    // invoke the method that loads the CLR

    HRESULT hrCorBind = CorBindToRuntimeEx(
        NULL, // CLR version - NULL load the latest available // L"v4.0.30319",
        L"wks", // GCType ("wks" = workstation or "svr" = Server)
        0, // STARTUP_LOADER_SAFEMODE
        CLSID_CLRRuntimeHost,
        IID_ICLRRuntimeHost,
        (PVOID*)&pRuntimeHost);
    if (FAILED(hrCorBind))
    {
        printf("CorBindToRuntimeEx failed : %08X\n", hrCorBind);
        goto cleanup;
    }
    // ***

    HRESULT hr = pRuntimeHost->Start();
    if (FAILED(hr))
    {
        printf("pRuntimeHost->Start() failed : %08X\n", hr);
        goto cleanup;
    }

    DWORD dwRet = 0;
    //hr = pRuntimeHost->ExecuteInDefaultAppDomain(L"SampleManagedApp.exe",
    //                                             L"SampleManagedApp.Program",
    //                                             L"Test",
    //                                             L"Hello World!",
    //                                             &dwRet);
    hr = pRuntimeHost->ExecuteInDefaultAppDomain(L"ClassLibrary4VC.dll",
        L"ClassLibrary4VC.ClassLibraryTest01",
        L"ClassLibraryFunc01",
        L"Hello World!",
        &dwRet);
    if (FAILED(hr))
    {
        printf("pRuntimeHost->ExecuteInDefaultAppDomain failed : %08X\n", hr);
        goto cleanup;
    }

    WORD words[6] = { 0 };
    words[0] = 11;
    words[1] = 22;
    words[2] = 33;
    words[3] = 07;
    words[4] = 55;
    hr = pRuntimeHost->ExecuteInDefaultAppDomain(L"ClassLibrary4VC.dll",
        L"ClassLibrary4VC.ClassLibraryTest01",
        L"ClassLibraryFunc02",
        (WCHAR*)&words[0],
        &dwRet);

    hr = pRuntimeHost->Stop();
    if (FAILED(hr))
    {
        printf("pRuntimeHost->Stop() failed : %08X\n", hr);
        goto cleanup;
    }

cleanup:
    if (pRuntimeInfo != nullptr)
    {
        pRuntimeInfo->Release();
        pRuntimeInfo = nullptr;
    }

    if (pRuntimeHost != nullptr)
    {
        pRuntimeHost->Release();
        pRuntimeHost = nullptr;
    }

    if (pMetaHost != nullptr)
    {
        pMetaHost->Release();
        pMetaHost = nullptr;
    }

    system("pause");
}

2、

时间: 2024-08-23 03:12:54

VcCallC#_02的相关文章

基于C/S架构的3D对战网络游戏C++框架 _02系统设计(总体设计、概要设计)

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

学习JavaScript王者归来_02

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <html>     <head>         <title></title>         <script>             function ArrayList(array) {                 this._arr =

JNI(Java Native Interface)_02

JNI(Java Native Interface)_02 ndk开发常用术语 观察jni.h文件的c语言细节: 交叉编译 在一种平台下编译出能够在另外一种平台下运行二进制代码 平台(1,操作系统:windows linux mac os solaris 2,cpu x86 arm mips) 交叉编译原理 源代码--->编译---->动态库(.dll,.so)-->目标平台运行 windows 源代码编译成 linux,arm下的可执行文件 ndk开发工具 ndk (native de

Java千百问_02基本使用(015)_java如何通过汇编方式运行

点击进入_更多_Java千百问-基本使用 1.java如何通过汇编方式运行 java本身不能通过汇编方式运行.但是,我们可以通过某些插件,在运行中将java代码解释为汇编指令,让我们能够通过分析执行的汇编指令来查找一些问题,也可以帮助我们分析和理解JVM是如何解释和编译的(当然java本身的编译和运行和汇编无关). PrintAssembly是JVM的一个运行参数,它允许我们获取在控制台打印java代码翻译成的汇编指令.使用PrintAssembly需要一些插件的支持,这些并不是JVM直接提供的

statusBar状态栏_02

苹果终于发布了iOS 7正式版,大批的用户都已经纷纷进行了升级.如果App是由Xcode 4.6或者更早版本生成,iOS 7系统会使用兼容模式运行该App,以便尽可能保持原有外观.但是,当使用Xcode 5重新编译App源代码时,此时会使用iOS 7 SDK来进行编译链接.(注意在使用Xcode 5打开旧项目之前备份项目源代码,因为Xcode 5会升级项目中的资源文件,且无法再使用旧版本的Xcode打开.)由于iOS 7 SDK较早期版本的SDK改动较大,因此App的界面也会出现种种问题,其中最

Delphi_04_Delphi_Object_Pascal_基本语法_02

这里简单的描述Object的语法中的基本内容,数据类型.因为代码是自描述的所以不废话,直接贴代码. { 用户自定义类型 1.数组 2.动态数组 3.记录 4.集合 } program UserDefine; {$APPTYPE CONSOLE} uses SysUtils; { 记录 1.记录相当于C语言中的结构体 2.记录类型通过 type 和 record 关键字来定义 3.记录类型要在使用前定义,通常放在 var 定义之前说 4.可以定义可变记录类型,可变记录类型就和C语言中的unio类型

Web学习笔记_02

通过css设置块元素位置 了解了块元素的组成结构之后,通过设置块元素的margin,可以轻松调整块元素的位置 margin: 10px 20px 30px 40px 通过设置4个数值可以分别对上右下左(顺时针方向)四个边距进行调整: margin: 10px 20px 通过设置两个数值,则这两个数值会被循环两次,得到四个边距值: margin: 10px 同理,如果只设置了一个值,则会循环四次,得到四个边距值: 如果设置三个值,则会将第二个值同时用于左右方向: 除了用margin同时设置外,还可

&lt;第一天&gt;--Python学习_02

1.python数据类型  A.整数: -----------------------------创建--------------------------------- a = 123 print(type(a))   # 查看a的数据类型. -----------------------------转换--------------------------------- age = '18' new_age = int(age) # 字符转为整数 B.布尔值:[true与false] -----

Java千百问_02基本使用(014)_mac系统如何管理环境变量

点击进入_更多_Java千百问-基本使用 1.mac系统如何管理环境变量 mac系统中管理环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量.具体配置方法如下: 系统级 通过修改./etc/profile文件来配置,全局(公有)配置,不管是哪个用户,登录时都会读取该文件.不建议修改这个文件. 用户级 ./etc/bashrc,全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件. .b