繁体   English   中英

通过反射从C#访问C ++非成员函数

[英]Accessing a C++ non-member function from C# via reflection

我需要获得有关C ++程序的一些运行时信息,由于C ++没有提供一些复杂的反射机制,因此这有点困难。 现在,我的方法是使用/ clr编译C ++代码,并从C#反映生成的程序集(这是因为我比C ++更喜欢该语言)。

尽管这一切或多或少都很好,但现在我陷入了需要通过调用main方法来实际运行程序的问题。 考虑到我已经走了多远,这真令人沮丧...

这是有问题的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包含三种类型,所有这些类型都与doMAIN关联(即与sc_main方法无关)我在寻找)。 我假设它与不公开有关,但是将其声明为HelloWorld类的静态公共成员函数也不起作用,因为该函数预期将是一个非成员函数。 还是我只是忽略了一个非常愚蠢的东西?

不,它没有。 您需要了解C ++ / CLI的工作原理-您不能只使用/ CLR重新编译C ++程序并完成它。 这里的sc_main方法是本机方法,不是托管方法,您无法对其进行反思,并且对于HelloWorld类型也是如此,除非您将其重新定义为ref class ,但是我怀疑您这样做了,因为您进入了main按值实例化它,只有当它是本机类时才是合法的。

NET和本地代码有非常根本的不同语义和一个神奇的编译器开关不会帮助你在这方面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM