访问C++;通过反射从C#得到的非成员函数 我需要获取一些关于C++程序的运行时信息,这是因为C++没有提供一些复杂的反射机制而困难的。现在,我的方法是使用C/R代码编译C++代码,并从C++中对生成的程序集进行反思(仅仅因为我喜欢C++语言)。

访问C++;通过反射从C#得到的非成员函数 我需要获取一些关于C++程序的运行时信息,这是因为C++没有提供一些复杂的反射机制而困难的。现在,我的方法是使用C/R代码编译C++代码,并从C++中对生成的程序集进行反思(仅仅因为我喜欢C++语言)。,c#,c++,reflection,clr,non-member-functions,C#,C++,Reflection,Clr,Non Member Functions,虽然这一切或多或少都很好,但我现在陷入了一个困境,需要通过调用其主方法来实际运行程序。考虑到我已经走了多远,这有点令人沮丧 这是C++程序中的问题: #include "systemc.h" #include <iostream> using namespace std; // Hello_world is module name SC_MODULE (HelloWorld) { SC_CTOR (HelloWorld) { // Nothing in co

虽然这一切或多或少都很好,但我现在陷入了一个困境,需要通过调用其主方法来实际运行程序。考虑到我已经走了多远,这有点令人沮丧

这是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);
}

现在,虽然hello类型数组包含HelloWorld类(或者至少我假设它就是该类),但main var包含三种类型,它们都处理域(即与我正在寻找的sc_main方法无关)。我假设它与它不是公共函数有关,但是将它声明为HelloWorld类的静态公共成员函数也不起作用,因为该函数应该是要找到的非成员函数。还是我只是忽略了一些非常愚蠢的事情?

不,不是。你需要学习C++如何运行CLI——你不能只用CLR重新编译C++程序,而要完成它。这里的
sc_main
方法是本机的,不是托管的,您无法对其进行反思,HelloWorld类型也是如此,除非您将其重新定义为
ref类
,但我怀疑您是否这样做了,因为在main中您通过值对其进行实例化,这只有在它是本机类时才是合法的


.NET和本机代码具有非常根本不同的语义,而魔法编译器开关在这方面对您没有帮助。

是否考虑过使用COM来实现这一点?你可以制作C++接口,将它转换成C语言,并利用COM,利用它的HeloWord C++类,就像它是dotNET.Irc,p调用可以用来调用一个本机函数,但是正如我所说的,“我需要获取一些运行时信息”,这就是为什么我选择反射。我打算把程序运行到某一点,然后查看创建了什么对象实例。@ CIPI:如果我没有搞错,COM要求您更改基础C++源代码…这是我想要避免的。我的项目最好的情况是运行一个现有的C++项目,看看那里发生了什么。给出了对源代码的访问,但是任何需要在C++代码库中更改的方法目前被认为是次优的解决方案。@杰伊:嗯,是的,你必须采用源代码到COM…实现几个方法,并添加一些头文件。而且您还必须向regsvr32注册它。。。但我想那不是你想要的。快乐编码!:你介意详细说明一下吗?这说明,如果.exe是用/CLR:纯//CLR:安全编译器选项构建的,则允许使用VisualC++编译器创建的.exe的反射,所有给定的示例都只需要/CLR选项。您是否有任何来源允许我“了解C++/CLI如何工作”@Jay:a
.exe
上的反射与对其所有内容的反射不同-您只能对托管内容进行反射。至于源代码,我手头没有任何好的C++/CLI教程。如果你想对内容进行反思,你必须将整个代码库转换成.NET,这是一个非常次优的解决方案。。。即使在
sc_main
的正上方添加一个类似
int sc_main_managed(){return 0;}
的方法,而该方法似乎根本不包含任何非托管代码,也不会使原始问题中给出的main[]-数组的一部分。添加
#pragma managed
没有帮助,将方法添加到HelloWorld类中也没有帮助,不管是静态的还是非静态的。你能给我一个或两个提示,说明是什么让一个方法被管理或不被管理吗?我不完全确定,我还没有详细使用C++/CLI,但我相信它一定是
公共引用类的静态成员。但是,我知道,你不能轻易地转换现有的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();