C1189#错误:<;互斥锁>;使用/clr或/clr:pure编译时不支持 我有一个C++库,它带有托管C++类和非托管C++类,因此库是用/CLR支持编译的。我需要在非托管端进行一些线程安全锁定,但如果包括,则会出现编译器错误: C1189 #error: <mutex> is not supported when compiling with /clr or /clr:pure 使用/clr或/clr:pure编译时不支持C1189#错误:

C1189#错误:<;互斥锁>;使用/clr或/clr:pure编译时不支持 我有一个C++库,它带有托管C++类和非托管C++类,因此库是用/CLR支持编译的。我需要在非托管端进行一些线程安全锁定,但如果包括,则会出现编译器错误: C1189 #error: <mutex> is not supported when compiling with /clr or /clr:pure 使用/clr或/clr:pure编译时不支持C1189#错误:,c++,multithreading,c++-cli,mutex,unmanaged,C++,Multithreading,C++ Cli,Mutex,Unmanaged,我怎样才能解决这个问题?花了几个小时搜索,但只找到了非常旧的信息。使用Visual Studio 2017和C++ 11语言标准,< P>混合模式项目可以包括非托管C++和托管C++/CLI代码。由于在使用/clr编译时不支持,因此需要将其移动到单独的.cpp文件集中,以便在不使用/clr的情况下编译。可以通过向项目中添加一个新的.cpp文件,然后将该特定.cpp文件的属性页/配置属性/C/C++/General/Common Language运行时支持设置从/clr更改为无(不适用于整个项目)

我怎样才能解决这个问题?花了几个小时搜索,但只找到了非常旧的信息。使用Visual Studio 2017和C++ 11语言标准,

< P>混合模式项目可以包括非托管C++和托管C++/CLI代码。由于在使用
/clr
编译时不支持
,因此需要将其移动到单独的
.cpp
文件集中,以便在不使用
/clr
的情况下编译。可以通过向项目中添加一个新的
.cpp
文件,然后将该特定
.cpp
文件的属性页/配置属性/C/C++/General/Common Language运行时支持设置从
/clr
更改为无(不适用于整个项目)

  • 必须将代码移动到单独的文件集中,以便在不使用整个
    /clr
    的情况下进行编译。仅将代码放入使用
    /clr
    编译的文件中的
    #pragma unmanaged
    块中是行不通的

  • 如果项目使用预编译头,则必须将新文件设置为不使用预编译头,因为不应在使用vs.without
    /clr
    生成的对象之间共享该预编译头


“…在非托管端”-与您使用的编译器开关不同。如果编译的是CL/CLR,不管你是否愿意,都在编译托管C++代码。最好将非托管代码与托管代码分离到一个单独的DLL项目中,然后使用pinvoke或rcw com包装来使用它。或者,接受您已经使用的clr,只使用system threading monitor产品。不能使用system::threading::monitor,因为它需要一个公共托管变量来锁定,并且我不能在非托管类中声明托管属性。还有这个类。但是,使用/CLR标志,您确实拥有完全托管模式支持,并且可以在“非托管”代码中使用托管属性。锁类还需要一个托管变量来锁定,如果它的非托管,则不能在我的类中使用它。因为我正在调用C++非托管API,所以我使用了非托管类,并且我认为它会有更好的性能。但也许这是胡说八道,因为正如你所说,代码已经是clr了。因此,最好的解决方案可能是直接使用托管类并使用lock clr类。我看到一些10年前的帖子提供了这方面的信息,我希望找到一些现代的解决方案,但显然没有其他解决方案。@PedroFerreira承认,C++/CLI有点粗糙,我想永远都是这样。但互操作的替代方案比IMHO糟糕得多,即使在计算这些/clr特性时也是如此。