Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将并发运行时与.NET代码混合使用? 我一直在使用C++静态库,最近想在C++ /CLI项目中使用这个库,以利用Windows窗体设计器并避免MFC。不幸的是,并发运行时与C++/CLI中所需的/clr开关不兼容。我尝试在“#pragma unmanaged…#pragma managed”指令中围绕使用并发运行时的包含头文件,但尽管在过去其他代码中这对我很有效,但在本例中似乎不起作用。我的意思是我得到了错误: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\concrt.h(27): fatal error C1189: #error : ERROR: Concurrency Runtime is not supported when compiling /clr._.net_Visual Studio_Visual C++_Concurrency_C++ Cli - Fatal编程技术网

如何将并发运行时与.NET代码混合使用? 我一直在使用C++静态库,最近想在C++ /CLI项目中使用这个库,以利用Windows窗体设计器并避免MFC。不幸的是,并发运行时与C++/CLI中所需的/clr开关不兼容。我尝试在“#pragma unmanaged…#pragma managed”指令中围绕使用并发运行时的包含头文件,但尽管在过去其他代码中这对我很有效,但在本例中似乎不起作用。我的意思是我得到了错误: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\concrt.h(27): fatal error C1189: #error : ERROR: Concurrency Runtime is not supported when compiling /clr.

如何将并发运行时与.NET代码混合使用? 我一直在使用C++静态库,最近想在C++ /CLI项目中使用这个库,以利用Windows窗体设计器并避免MFC。不幸的是,并发运行时与C++/CLI中所需的/clr开关不兼容。我尝试在“#pragma unmanaged…#pragma managed”指令中围绕使用并发运行时的包含头文件,但尽管在过去其他代码中这对我很有效,但在本例中似乎不起作用。我的意思是我得到了错误: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\concrt.h(27): fatal error C1189: #error : ERROR: Concurrency Runtime is not supported when compiling /clr.,.net,visual-studio,visual-c++,concurrency,c++-cli,.net,Visual Studio,Visual C++,Concurrency,C++ Cli,我不太擅长混合托管和非托管代码,所以可能有一个我不知道的解决方法。但另一方面,也许这只是一种愚蠢的做法。如果不是因为我发现MFC不可能复杂,表单设计器又好又简单,我就做纯C++。对于混合这两个选项,有什么建议吗?< P>可以考虑编写一个托管GUI,并调用一个非托管DLL:如果您可以打包并发运行时,以及使用它的代码,作为DLL。在C++/CLI中使用ConcRT在ConcRT.h中通过下面的语句被显式禁用,因为它不受官方支持 #if defined(_M_CEE) #error ERROR:

我不太擅长混合托管和非托管代码,所以可能有一个我不知道的解决方法。但另一方面,也许这只是一种愚蠢的做法。如果不是因为我发现MFC不可能复杂,表单设计器又好又简单,我就做纯C++。对于混合这两个选项,有什么建议吗?

< P>可以考虑编写一个托管GUI,并调用一个非托管DLL:如果您可以打包并发运行时,以及使用它的代码,作为DLL。

在C++/CLI中使用ConcRT在ConcRT.h中通过下面的语句被显式禁用,因为它不受官方支持

#if defined(_M_CEE)
   #error ERROR: Concurrency Runtime is not supported when compiling /clr.
#endif
您可以按照上面的建议使用PInvoke来解决这个问题,或者您也可以使用指向实现的指针习惯用法来解决这个问题,方法是向前声明一个“pimpl”类,并将concrt.h上的依赖项隐藏到一个本机.cpp文件中,然后将该文件编译成lib并与头文件链接

e、 g.在.h文件中:

//forward declaration
class PImpl;

class MyClass
{
  ....
  //forward declaration is sufficient because this is a pointer
  PImpl* m_pImpl;
}
e、 g.在编译为本机库的.cpp文件中:

  #include <ppl.h>
  class PImpl
  {
   //some concrt class
   Concurrency::task_group m_tasks;
  }
#包括
类PImpl
{
//一些浓缩类
并发性::任务组m_任务;
}

我不确定您的并发需求有多详细,但效果很好(即,您可以将选项
/clr
/openmp
组合在一起)

array^ model。。。。;
#pragma-omp并行
对于(int i=0;i长度;i++){
模型[i]=计算模型(i);
}

即使C++/CLI中的ConcRT被显式禁用,您也可以使用clr支持编译您的项目,并在同一项目中使用一些本机类,方法是将CompileAsManaged属性设置为false,并在vcxproj文件中将PrecompileHeader设置为NotUsing(我已使用VS2013对此进行了测试):


我在使用C++语言连接C++到C语言时遇到了同样的问题。 此问题是在直接引用CLR项目中包含的头文件(*.h)中的以下项时引起的

#include <ppl.h>
using namespace concurrency;
#包括
使用名称空间并发;

由于CLR不支持并发,因此在CLR项目生成中会出现错误。将这两行移动到相应的*.CPP文件中解决了问题。

请不要让我们猜测什么“不工作”。如果我充分理解p/jck,为了使用C++库中的各种类,我必须做一些主要工作来包装每个类(例如,)。还是有更简单的方法?这似乎和创建/维护MFC一样多。至少我知道一些MFC;我从未使用过P/Invoke。@Michael我不知道你的应用程序是什么,但在最简单的情况下,DLL只需要导出一个函数,名为
DoAllTheWork()
或类似的函数。该函数通过PInvoke从GUI调用。该函数(在DLL中实现)将在其实现中使用并发运行时作为实现细节;它不需要向GUI公开所有并发运行时函数。这正是我要找的东西。非常感谢。不客气,您可以随时在msdn.com/concurrency论坛上询问团队(如果我当时没有观看stackoverflow,请PM me)。我一直在尝试公开task_group类的一个运行方法,但它使用了一个模板。如果使用模板,那么您必须声明整个函数,这意味着不可能隐藏ppl.h的使用。还是我遗漏了什么?在你的p_impl类中添加一个方法,该方法要么获取指向函数的指针,要么获取包装运行的std::function对象。这个技巧可以从编译和构建的角度解决这个问题。我的问题是,我们是否应该这样做?由于该文档指出并发运行时与/clr模块混合不好,这是否会导致运行时问题,尽管我们欺骗了构建系统。
<ClCompile Include="NativeProcessWithThread.cpp">
  <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
  <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
  <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  </PrecompiledHeaderFile>
  <PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  </PrecompiledHeaderOutputFile>
  <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
  <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
  <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  </PrecompiledHeaderFile>
  <PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  </PrecompiledHeaderOutputFile>
</ClCompile>
NativeProcessWithThread nativeProcess = NativeProcessWithThread();
#include <ppl.h>
using namespace concurrency;