从我的 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 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;

我不知道这最后一个功能是否有效,但您大致了解。

【讨论】:

感谢信息!!!但我确实想避免读取由我的 .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++的主要内容,如果未能解决你的问题,请参考以下文章

C#:使用 char** 参数调用 C++ DLL

调用使用 C# 返回结构数组的非托管 dll 函数

C++ 库问题

调用 DLL 函数时遇到问题

创建 C++ Dll,并从 C# 调用它

嵌入式单声道:将数组从 C# DLL 返回/复制到 C++