使用托管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 }
微信扫码,自愿捐赠。天涯同道,共谱新篇。
微信捐赠不显示捐赠者个人信息,如需要,请注明联系方式。 |