Articles of C ++ CLI

C ++ / CLI:公共ref结构生成C2011:'class'types的重定义

我有一个托pipeDLL项目中的头文件,如下所示: Enums.h: #pragma once … public ref struct ManagedStruct { Bitmap^ image; } … 这个头文件是从DLL中的另一个类和一个单独的可执行文件中引用的。 单独的托pipe结构正在生成: 错误C2011:'ManagedStruct':'类'types重新定义。 如果我将结构移动到DLL中的主头文件中,它可以正常工作,并且可以公开访问,所以这就是我正在做的事情,但是我非常想知道为什么当我将它移动到另一个文件时。 我已经检查了所有必要的包含和命名空间,并尝试了明显的头卫兵,无济于事; 我仍然得到错误。 非常感谢任何见解!

在标准C ++或C#上使用C ++ / CLI有什么好处吗?

我没有看到任何真正的优势,除了你有一个C + +语法的事实,并与它,像指针和析构函数。

适用于C#应用程序的任何CPU / x86 / x64,并且是C ++ / CLI依赖项

我是Windows开发人员,我正在使用Microsoft Visual Studio 2008 SP1。 我的开发者机器是64位的。 我目前使用的软件是用C#编写的.exe文件。 不幸的是,我无法仅仅用C#来解决整个问题。 这就是为什么我还用C ++ / CLI开发了一个小的托pipeDLL。 两个项目都在相同的解决scheme。 我的C#.exe生成目标是“任何CPU”。 当我的C ++ DLL生成目标是“x86”时,DLL不加载。 据我了解,当我GOOGLE了,原因是C / CLI语言,不像其他.NET语言,编译为本地代码,而不是托pipe代码。 我将C ++ DLL构build目标切换到了x64,现在一切正常。 但是,一旦我的客户将我的产品安装在32位操作系统上,AFAIK一切都将停止工作。 我必须支持Windows Vista和7,它们都是32位和64位版本。 我不想回落到32位。 我的DLL中的250行C ++代码只占我的代码库的2%。 而且这个DLL只在几个地方使用,所以在典型的使用场景中它甚至没有加载。 我的DLL使用ATL实现两个COM对象,所以我不能使用“ / clr:safe ”项目设置。 有没有办法configuration解决scheme和项目,以便C#项目build立“任何CPU”的版本,C + +项目build立32位和64位版本,然后在运行时,托pipe的.EXE启动时,它使用32位DLL或64位DLL取决于操作系统? 或者也许有一些更好的解决scheme,我不知道? 提前致谢!

LNK2022元数据操作:重复types中的布局信息不一致

我正在使用的项目中遇到了新的链接器错误: 1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<char,std::char_traits<char>,std::allocator<char> >): (0x0200004e). 1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >): (0x02000075). 1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000091). […]

用静态存储持续时间破坏本地对象

2012-12-09总结: 在普通混合模式应用程序中,全局本地C ++析构函数作为终结器运行。 无法更改该行为或关联的超时。 混合模式程序集DLL在DLL加载/卸载期间运行C ++构造函数/析构函数 – 与原生DLL完全一样。 使用COM接口将CLR托pipe在本地可执行文件中,可以使解构器在本地DLL(我期望的行为)中运行,并为终结器设置超时(额外奖励)。 据我可以告诉上面适用于至lessVisual Studio 2008,2010和2012.(只testing与.NET 4) 我打算使用的实际CLR托pipe可执行文件与此问题中列出的可执行文件非常相似,只是进行了一些小的更改: 按照Hans Passant的build议,将OPR_FinalizerRun设置为某个值(目前为60秒,但可能会更改)。 使用ATL COM智能指针类(这些在Visual Studio的高级版本中是不可用的,所以我在这篇文章中省略了它们)。 Lodaing从mscoree.dlldynamicCLRCreateInstance (以便在安装兼容CLR时允许更好的错误消息)。 将命令行从主机传递到程序集DLL中指定的Main函数。 感谢所有花时间阅读问题和/或评论的人。 2012-12-02更新在post底部。 我正在使用Visual Studio 2012与.NET 4混合模式C ++ / CLI应用程序,惊奇地发现一些本地全局对象的析构函数没有被调用。 调查这个问题,事实certificate,他们的行为像本文所解释的托pipe对象。 我对这种行为感到非常惊讶(我理解它是用于pipe理对象的),无论是在C ++ / CLI标准还是在析构函数和终结器的描述中,都找不到任何地方。 在Hans Passant的评论中,我把这些程序编译成一个程序集DLL,并把它存放在一个小的本地可执行文件中,它给了我所期望的行为(析构函数有足够的时间在同一个线程中完成并运行build)! 我的问题: 我可以在独立的可执行文件中获得相同的行为吗? 如果(1)不可行,是否可以configuration进程超时策略(即基本上调用ICLRPolicyManager->SetTimeout(OPR_ProcessExit, INFINITE) )为可执行文件? 这将是一个可接受的解决方法。 这是在哪里logging/我怎样才能更多地教育自己的话题? 我宁愿不依赖于可能改变的行为。 重新编译下面的文件如下: cl /EHa /MDd CLRHost.cpp cl /EHa /MDd /c […]

如何制作System :: Windows :: Forms :: Checkbox ^的向量/数组

找不到任何问题的答案,甚至没有任何问题。 所以我想要做的,是一个std :: vector,也许只是一个正常的数组,checkbox。 std::vector< System::Windows::Forms::CheckBox^ >m_items; m_items.push_back( myCheckbox ); 这就是我目前所拥有的,显然是行不通的。 所以,有没有人有任何想法,如何得到它的工作,因为我尽我所能,但载体似乎不支持checkbox。 Incase你需要错误代码: c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(200): error C3699: '&&' : cannot use this indirection on type 'System::Windows::Forms::CheckBox ^' 1> c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector(421) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled 1> with 1> [ 1> _Ty=System::Windows::Forms::CheckBox ^ […]

如何检查我的DirectShow渲染器filter是否被使用?

在我的DirectShow项目中,我创build了一个filter(从CBaseVideoRenderer派生)来渲染到一块内存。 这在大多数情况下工作得很好,我添加了filter mGraphBuilder->AddFilter(pInterfaceInfo, MemoryRendererName); 并依靠GraphBuilder来完成剩下的工作。 但是,在某些情况下,graphics构build器和我的filter无法达成共同的格式,并会绕过我的filter创build一个新的ActiveMovie窗口。 我想知道这是什么时候发生的,所以我知道我的filter没有被使用,但不能解决问题。 我列举了我的图中的所有filter,使用以下方法查找我的filter: (编辑:我把我的GraphBuilder对象作为pGraphparameter passing给我时) HRESULT MediaPlayer::CheckFilterGraphFor(IFilterGraph *pGraph, IBaseFilter* pFilterToLookFor) { IEnumFilters *pEnum = NULL; IBaseFilter *pFilter; ULONG cFetched; HRESULT enumeratedFilterCount = 0; FILTER_INFO pRefFilterInfo; pFilterToLookFor->QueryFilterInfo(&pRefFilterInfo); HRESULT hr = pGraph->EnumFilters(&pEnum); if (SUCCEEDED(hr)) { while(pEnum->Next(1, &pFilter, &cFetched) == S_OK) { enumeratedFilterCount–; FILTER_INFO FilterInfo; hr = pFilter->QueryFilterInfo(&FilterInfo); if (SUCCEEDED(hr)) { if(wcscmp(FilterInfo.achName, pRefFilterInfo.achName) […]