从我的c++应用程序调用c#dll(解析XML文件),将数组/列表返回给c++
Calling c# dll (which parses XML file) from my c++ application to return array / list to c++
我有一个简单的c++应用程序。此应用程序只是打印文本。我还有一个c#.dllNET3.5,它解析复杂的xml文件,提取值并将它们保存到列表中。它类似于具有4个方法的2个类。他们打开一个文件,解析xml并将其存储到List中。当c#.dll完成时,它有一个包含10000个值的List;
由于我不想用c++编写复杂的解析XML,所以我想使用我的c#XML解析.dll。
对我来说,是否可以从我的c++应用程序内部调用我的c#.dll,让c#.dll解析指定的xml文件,并将创建的List和解析的xml值返回给我的c++应用程序?
在我的c++应用程序中,我将继续修改返回列表中的数据。
编辑:我将使用vc++(Microsoft Visual Studio 2010)
edit2:对于另一个更大的应用程序来说,vc++应用程序将是一个开销/插件。我会将插件注册到更大的应用程序中,每次按下菜单中的图标,我的vc++应用程序就会启动
编辑3:有人经历过这样的任务吗?如果可能的话,我需要一个明确的"是"或"否"。
edit4:我确实希望避免读取由我的.net.dll编写的文件。我希望我的c++应用程序向我的.nt.dll发送一个字符串,并接收回一个列表/数组对象。或者这是个坏主意,我应该在c++中自己进行xml解析
是的,你可以做到,但有点难。一种方法是使用C++加载CLR并执行您的函数,类似于以下内容:
代码灵感来自Blizzhackers.cc
void StartNET()
{
DWORD result;
ICLRRuntimeHost* pCLR = NULL;
CorBindToRuntimeEx(NULL, L"wks", NULL, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&pCLR);
pCLR->Start();
pCLR->ExecuteInDefaultAppDomain(L"C:\myNET.dll", L"myNet.Program", L"Main", L"arg", &result);
pCLR->Stop();
}
这个C++代码将执行来自namespace myNet
和class Program
的int Main(string arg)
函数,我的意思是:
myNET.dll:
namespace myNet
{
class Program
{
int Main(string arg)
{
//and here you can run your XML parser:
List<string> myList = XMLParse();
FileStream fs = new Filestream("xmllist.txt");
StreamWriter sw = new StreamWriter(fs);
foreach(string s in myList)
sw.WriteLine(s);
sw.Close();
fs.Close();
return 1;
}
List<string> XMLParse()
{
//Your code here
return aList;
}
}
}
之后,您可以使用c++从xmllist.txt中获取文件,类似于:
vector<char[]> getList()
{
vector<char[]> *myVector = new vector<char>;
ifstream cin("xmllist.txt");
while(!cin.eof())
{
char line[100];
cin >> line;
myVector.push(line);
}
cin.close();
return myVector;
}
我不知道最后一个函数是否有效,但你已经大致了解了。
我不久前在C++中创建了一个托管/非托管dll。(不过要注意的是,C++.net并不是最简单的语法。)
事实上,我现在不知道从哪里开始,也许这有信息http://channel9.msdn.com/Forums/TechOff/101918-Mixing-Managed-and-Unmanaged-C-in-a-DLL。这当然是有可能的。。与2005年相比?这样,您就可以在一个二进制/程序集中管理非托管代码,从而调用C#dll。
除此之外,您还可以将C#对象包装为COM对象。http://msdn.microsoft.com/en-us/library/ms404285.aspx。然后可以使用COM互操作。
在每种情况下,整理输入/输出都需要一些尝试和错误——如果你以前从未这样做过,那就不那么明显了。
实际上,这个链接应该涵盖所有内容:http://msdn.microsoft.com/en-us/library/ms973872.aspx。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '