1

C ++プログラムに関する実行時情報を取得する必要があります。これは、C++が高度なリフレクションメカニズムを提供していないために少し難しいです。ここで、私のアプローチは、/clrを使用してC++コードをコンパイルし、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クラスが含まれていますが(または少なくともそのクラスだと思います)、main varには3つのタイプが含まれ、それらはすべてdoMAINを処理します(つまり、sc_mainメソッドとは関係ありません。 m探しています)。パブリックではないことと関係があると思いますが、HelloWorldクラスの静的パブリックメンバー関数を宣言しても、関数は非メンバー関数であることが予想されるため、機能しません。それとも私はひどく愚かな何かを見落としているだけですか?

4

1 に答える 1

3

いいえ、そうではありません。C ++ /CLIがどのように機能するかを学ぶ必要があります。/CLRを使用してC++プログラムを再コンパイルし、それで実行することはできません。ここでのsc_mainメソッドはネイティブであり、管理されておらず、反映することはできません。HelloWorldタイプについても、を再定義しない限り同じことが言えref classますが、メインでインスタンス化するために行ったのではないかと思います。 value。これは、ネイティブクラスの場合にのみ有効です。

.NETとネイティブコードのセマンティクスは根本的に異なり、マジックコンパイラスイッチはこの点では役に立ちません。

于 2011-08-09T09:27:09.910 に答える