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

使用托管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 ^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 ^ bs = gcnew array(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 ^ parameters = info->GetParameters();
21     if ((parameters != nullptr) && (parameters->Length > 0))
22     {
23         info->Invoke(nullptr, (array ^) args);
24     }
25     else
26     {
27         info->Invoke(nullptr, nullptr);
28     }
29     return 0;
30 }

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

 1     static class Program
 2     {
 3         /// 
 4         /// 应用程序的主入口点。
 5         /// 
 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     }

 

你可能感兴趣的:(使用托管C++调用C#的exe程序)