Доступ к функции, не являющейся членом C ++, из C # через отражение - PullRequest
1 голос
/ 09 августа 2011

Мне нужно получить некоторую информацию во время выполнения о программе на 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 также не работает, поскольку ожидается, что эта функция будет функцией, не являющейся членом. Или я просто смотрю на что-то ужасно глупое?

1 Ответ

3 голосов
/ 09 августа 2011

Нет, это не так.Вам нужно узнать, как работает C ++ / CLI - вы не можете просто перекомпилировать программу C ++ с / CLR и покончить с этим.Метод sc_main здесь является нативным, не управляемым, и вы не можете обдумать его, и то же самое относится и к типу HelloWorld, если только вы не определили его как ref class, но я сомневаюсь, что вы сделали, потому что там выперейдите к основному созданию его по значению, что было бы допустимо, только если это был нативный класс.

.NET и нативный код имеют принципиально различную семантику, и магический переключатель компилятора не поможетВы в этом отношении.

...