从我的c++应用程序调用c#dll(解析XML文件),将数组/列表返回给c++

Calling c# dll (which parses XML file) from my c++ application to return array / list to c++

本文关键字:c++ 数组 列表 返回 XML 调用 应用程序 我的 c#dll 解析 文件      更新时间:2023-10-16

我有一个简单的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 myNetclass Programint 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。