Мне нужно получить некоторую информацию во время выполнения о программе на C ++, что довольно сложно из-за того, что C ++ не предлагает какой-то сложный механизм отражения. Теперь мой подход состоит в том, чтобы скомпилировать код C ++ с использованием / clr и поразмышлять над полученной сборкой из C # (просто потому, что мне нравится этот язык больше, чем C ++).
Хотя все это получается более или менее нормально, сейчас я застрял в точке, где мне нужно фактически запустить программу, вызвав ее основной метод. Что разочаровывает, учитывая, как далеко я уже прошел ...
Это рассматриваемая программа на C ++:
#include "systemc.h"
#include <iostream>
using namespace std;
// Hello_world is module name
SC_MODULE (HelloWorld) {
SC_CTOR (HelloWorld) {
// Nothing in constructor
}
void HelloWorld::say_hello() {
//Print "Hello World" to the console.
cout << "Hello World.\n";
}
};
//sc_main in top level function like in C++ main
int sc_main(int argc, char* argv[]) {
HelloWorld hello("HELLO");
hello.say_hello();
string input = "";
getline(cin, input);
return(0);
}
Ничего особенного, правда ...
Это метод C #, используемый для проверки полученной сборки:
System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFrom(filename);
System.Console.WriteLine(filename + " is an assembly and has been properly loaded.");
Type[] hello = ass.GetTypes().Where(type => type.Name.ToLower().Contains("hello")).ToArray();
Type[] main = ass.GetTypes().Where(type => type.Name.ToLower().Contains("main")).ToArray();
Теперь, хотя hello Type-array содержит класс HelloWorld (или, по крайней мере, я предполагаю, что это тот класс), основной var содержит три типа, каждый из которых имеет дело с doMAIN (т.е. не имеет ничего общего с sc_main) метод, который я ищу). Я предполагаю, что это как-то связано с тем, что оно не является общедоступным, но объявление статической общедоступной функции-члена класса HelloWorld также не работает, поскольку ожидается, что эта функция будет функцией, не являющейся членом. Или я просто смотрю на что-то ужасно глупое?