从我的 c++ 应用程序调用 c# dll(解析 XML 文件)以将数组/列表返回给 c++
Posted
技术标签:
【中文标题】从我的 c++ 应用程序调用 c# dll(解析 XML 文件)以将数组/列表返回给 c++【英文标题】:Calling c# dll (which parses XML file) from my c++ application to return array / list to c++ 【发布时间】:2012-08-24 11:27:59 【问题描述】:我有一个简单的 c++ 应用程序。此应用程序只是打印文本。 我还有一个 c# .dll NET 3.5,它解析复杂的 xml 文件,提取值并将它们保存到列表中。它就像 2 个具有 4 种方法的类。他们打开一个文件,解析 xml 并将其存储到一个列表中。当 c# .dll 完成后,它有一个包含 10000 个值的列表;
由于我不想用 c++ 编写复杂的解析 XML,我想使用我的 c# xml 解析 .dll。
我是否可以从我的 c++ 应用程序中调用我的 c# .dll,让 c# .dll 解析指定的 xml 文件,然后将创建的列表连同解析的 xml 值返回给我的 c++ 应用程序?
在我的 c++ 应用程序中,我将继续修改返回列表中的数据。
编辑:我将使用 vc++ (Microsoft Visual Studio 2010)
edit2:vc++ 应用程序将是另一个更大应用程序的扩展/插件。我会将插件注册到那个更大的应用程序中,每次我按下菜单中的图标时,我的 vc++ 应用程序都会启动
edit3:有没有人经历过这样的任务?如果可能的话,我有点需要明确的是或否。
edit4:我确实想避免读取由我的 .net .dll 编写的文件。我希望我的 c++ 应用程序向我的 .net .dll 发送一个字符串并接收一个列表/数组对象。或者这是一个坏主意,我应该在 C++ 本身中进行 xml 解析?
【问题讨论】:
我认为您需要使用 C++.net,因为它将需要 .net Dlls。并且通过 C++ 使用该 DLL 需要您的标头。您还可以将其设为 Com 并使用一些底层 Windows 特定库来访问该 COM 总是有 Microsoft XML 解析器。 msdn.microsoft.com/en-us/data/bb190600.aspx 此外,通过谷歌搜索,您会发现大量其他 C++ XML 解析器。传递数据是没有问题的,只要你得到正确的签名,你还必须固定指针..加上..我认为..在托管代码中创建对象是最容易的。同样,您将拥有 C++ App -> 组合 C++ dll -> C# dll。 【参考方案1】:是的,你可以做到,但有点难。一种方法是使用 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;
我不知道这最后一个功能是否有效,但您大致了解。
【讨论】:
感谢信息!!!但我确实想避免读取由我的 .net .dll 编写的文件。我希望我的 c++ 应用程序从我的 .net .dll 接收列表对象。 c++ 向.net .dll 发送一个字符串并接收一个列表。 @Gero 那我建议你看看support.microsoft.com/kb/828736。我试过一次,它奏效了。注意:您将使用 COM。【参考方案2】:前段时间我在 C++ 中创建了一个托管/非托管 dll。 (请注意,尽管 C++.net 的语法不是最简单的。)
其实我现在不知道从何说起,或许这里有http://channel9.msdn.com/Forums/TechOff/101918-Mixing-Managed-and-Unmanaged-C-in-a-DLL的信息。这当然很可能与.. VS 2005?这样,您就可以在一个二进制/程序集中管理非托管代码,从而调用 C# dll。
除此之外,您还可以将 C# 对象包装为 COM 对象。 http://msdn.microsoft.com/en-us/library/ms404285.aspx 。然后就可以使用 COM 互操作了。
在每种情况下,编组输入/输出都需要一些试验和错误 - 如果您以前从未这样做过,这并不那么明显。
其实这个链接应该涵盖所有内容:http://msdn.microsoft.com/en-us/library/ms973872.aspx。
【讨论】:
我有使用 c# 的经验,但没有使用 c++。 vc++ +c# 的整个领域对我来说有点新。学c++需要什么是没有问题的;如果可能的话,我只是需要这些信息,这是有道理的,并且知道如何去做。以上是关于从我的 c++ 应用程序调用 c# dll(解析 XML 文件)以将数组/列表返回给 c++的主要内容,如果未能解决你的问题,请参考以下文章