【发布时间】:2011-08-09 09:12:44
【问题描述】:
我需要获得一些关于 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 类的静态公共成员函数也不起作用,因为该函数预计是要找到的非成员函数。还是我只是忽略了一些非常愚蠢的事情?
【问题讨论】:
-
曾经考虑过为此使用 COM 吗?您可以制作 C++ 接口,将其转换为 C#,并通过 COM 像 dotNET 一样使用您的 HelloWorld C++ 类。
-
Iirc,P-Invoke 可用于调用本机函数,但正如我所说,“我需要获取一些运行时信息”,这就是我选择反射的原因。我打算将程序运行到某个点,然后查看创建了哪些对象实例。
-
@Cipi:如果我没听错的话,COM 要求您更改底层 C++ 源代码……这是我想避免的。我的项目的最佳情况是运行现有的 C++ 项目,看看那里发生了什么。提供了对源代码的访问权限,但任何需要更改 C++ 代码库的方法目前都被认为是次优解决方案。
-
@Jay:嗯,是的,你必须对 COM 采用源代码......实现几个方法,并添加一些头文件。而且你还必须用 regsvr32 注册它......但我想这不是你想要的。快乐编码! :D
标签: c# c++ reflection clr non-member-functions