zoukankan      html  css  js  c++  java
  • 使用托管C++调用C#的exe程序

    使用托管C++调用C#的exe程序。

    (事后证明是对Reflector是无效的。)哎。

    添加CLR控制台应用程序。把C#的exe程序放到“资源文件”文件夹下,右键属性的项类型设置为已编译的托管资源。

    在主程序代码的main函数改写为如下内容:

     1 // x.cpp: 主项目文件。
     2 
     3 #include "stdafx.h"
     4 
     5 using namespace System;
     6 
     7 [STAThreadAttribute]
     8 int main(array<System::String ^> ^args)
     9 {
    10     System::Reflection::Assembly^ a;
    11     a = System::Reflection::Assembly::GetExecutingAssembly();
    12     System::IO::Stream ^ stream;
    13     stream = a->GetManifestResourceStream("csharp.exe");
    14     array<System::Byte> ^ bs = gcnew array<System::Byte>(stream->Length);
    15     stream->Read(bs, 0, (int)(stream->Length));
    16     System::Reflection::Assembly^ exe;
    17     exe = System::Reflection::Assembly::Load(bs);
    18     System::Reflection::MethodInfo^ info;
    19     info = exe->EntryPoint;
    20     array<System::Reflection::ParameterInfo^ > ^ parameters = info->GetParameters();
    21     if ((parameters != nullptr) && (parameters->Length > 0))
    22     {
    23         info->Invoke(nullptr, (array<System::Object ^ > ^) args);
    24     }
    25     else
    26     {
    27         info->Invoke(nullptr, nullptr);
    28     }
    29     return 0;
    30 }

     其对应的C#版代码如下:

     1     static class Program
     2     {
     3         /// <summary>
     4         /// 应用程序的主入口点。
     5         /// </summary>
     6         [STAThread]
     7         static void Main(string[] args)
     8         {
     9             var asm = Assembly.GetExecutingAssembly();
    10             Stream stream = asm.GetManifestResourceStream("csharp.exe");
    11             byte[] bs = new byte[stream.Length];
    12             stream.Read(bs, 0, (int)stream.Length);
    13             var exe = Assembly.Load(bs);
    14             MethodInfo info = exe.EntryPoint;
    15             ParameterInfo[] parameters = info.GetParameters();
    16             if ((parameters != null) && (parameters.Length > 0))
    17                 info.Invoke(null, (object[])args);
    18             else
    19                 info.Invoke(null, null);
    20             //Application.EnableVisualStyles();
    21             //Application.SetCompatibleTextRenderingDefault(false);
    22             //Application.Run(new Form1());
    23         }
    24     }
  • 相关阅读:
    LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)
    LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
    LeetCode 720. Longest Word in Dictionary (字典里最长的单词)
    LeetCode 690. Employee Importance (职员的重要值)
    LeetCode 645. Set Mismatch (集合不匹配)
    LeetCode 500. Keyboard Row (键盘行)
    LeetCode 463. Island Perimeter (岛的周长)
    115.Distinct Subsequences
    55.Jump Game
    124.Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/bitzhuwei/p/call_exe_within_managed_cpp.html
Copyright © 2011-2022 走看看