使用Visual Studio 2008和Boost库1.46.1我想用/ CLR标志编译和链接以下内容:
#include <boost/thread/thread.hpp>
void run() {}
int main(int argc, char *argv[])
{
boost::thread t(run);
}
Run Code Online (Sandbox Code Playgroud)
第一个错误是关于boost :: thread中的前向声明的伪结构.这篇文章 通过声明:
namespace boost {
struct thread::dummy {};
}
Run Code Online (Sandbox Code Playgroud)
当然,我现在可以编译,但后来我得到链接器警告
警告1警告LNK4248:'boost.detail.win32._SECURITY_ATTRIBUTES'的未解析的typeref标记(0100001F); 图像可能无法运行
运行应用程序导致
应用程序无法正确启动(0xc000007b).
前面提到的论坛帖子中的所有建议都不适合我.我已经构建了Boost Threads lib的静态版本,它运行正常,没有/ CLR标志.调试/发布没有区别.我在Win7 32位下运行.
任何提示?
以下代码编译警告和intellisense错误:
ref class Test {
initonly static TimeSpan Delay = TimeSpan(1,1,1);
Test() {
long long ticks = Delay.Ticks; // << problem
}
};
Run Code Online (Sandbox Code Playgroud)
问题是:
如何正确访问Ticks?
您好,我在c ++项目中使用\ clr之类的函数:
int WINAPI dmtTest(char *pcertificate)
{
String^ sCertificate;
sCertificate = pcertificate; // how can I assign pcertificate to sCertificate?
....
}
Run Code Online (Sandbox Code Playgroud) 注意:这篇文章代表我的询问问题#1.在两个问题中重复引入块(直到达到数字的所有文本),因为它是回答问题可能需要的背景信息.
我有一个非托管C++库,它包含几个"更高级别"库之间共享和共享的类和函数.我现在需要提供对C#/ .Net应用程序的公共库的访问.为此,我将使用C++/CLI包装类包装公共库.
公共库中包含的类可以是包含嵌套类定义和成员变量的复杂类,这些变量是其他类对象的集合.集合变量是用于管理集合的自定义列表类的typedef的实例.公共库还包括表示使用FLEX/BISON创建的自定义脚本文件语法的已解析结构的类.公共库和"更高级别"库都是以允许跨平台(Linux和GCC)编译和使用的方式编写的.我所做的任何改变都必须允许这样做.
C++/CLI包装器类首先只需要读取功能.但随着项目的进展,我最终还需要能够创建和修改对象.
我了解C++/CLI并为其他非托管C/C++项目创建了几个包装器,并为这个公共库提供了抽象功能.所以我已经掌握了基础知识(以及一些高级知识).
我有两个与执行此任务相关的问题,因为他们可以产生自己的讨论和解决方案,我将我的问题分成不同的帖子.我将在每篇文章中包含指向其他问题的链接.
如何在项目中构建我的文件?
非托管和C++/CLI项目之间的名称空间和类名称不会发生冲突.由于非托管项目使用类名称的"C"前缀而C++/CLI不使用.所以非托管类CWidget将变得公正Widget.他们使用不同的根命名空间名称.
当涉及文件名时会出现问题.作为我的默认命名模式是使用Widget.h与Widget.cpp两个非托管C++/CLI.
目前正在设置项目,项目的所有文件都位于项目文件夹的根目录中.头文件的包含仅作为标题的名称(例如#include "Widget.h").并且为了适当地解析包含不同项目的文件,将另一个项目的路径添加到Additional Include Directories使用项目的属性中.
如果我将我的Additional Include Directories属性更改为解决方案的根(..\)并为非托管标头执行我的包含,那么#include "Unmanaged\Widget.h我有一个新问题,即解析非托管标头中包含的标头.因此,使用该选项需要将所有 include语句更改为其项目目录的前缀.我知道其他项目
重复文件名问题最明显/最快的解决方案是更改其中一个库的命名模式.因此对于C++/CLI项目,而不是使用Widget.h和Widget.cpp前缀或后缀m(托管)或w(包装).所以C++/CLI的文件将是mWidget.h,wWidget.h,WidgetM.h,或WidgetW.h.然后,我可以重复我现有的模式并保持良好状态.
但有没有更好的方法来组织文件,以便我可以保留我的前/后缀较少的文件名,只需对现有代码进行最小的更改?
今天我看到C#代码创建静态字典并初始化它:
public static readonly Dictionary<string, string> dict = new Dictionary<string, string>()
{
{"br","value1"},
{"cn","value2"},
{"de","value3"},
};
Run Code Online (Sandbox Code Playgroud)
但是当我决定为C++/CLI编写相同的代码时,发生了错误.这是我的尝试:
static System::Collections::Generic::Dictionary<System::String^, System::String^>^ dict = gcnew System::Collections::Generic::Dictionary<System::String^, System::String^>( )
{
{"br","value1"},
{"cn","value2"},
{"de","value3"},
};
Run Code Online (Sandbox Code Playgroud)
我可以这样做,如果是这样,怎么样?
在我的项目中,我将一个byte []从C#传递给C++ CLR函数.
C++ CLR代码:
void TestByteArray(array<System::Byte>^ byteArray)
{
...
}
Run Code Online (Sandbox Code Playgroud)
C#代码:
byte[] bytes = new byte[128];
...
TestByteArray(bytes);
Run Code Online (Sandbox Code Playgroud)
在TestByteArray()函数中,我需要将byteArray转换为char*,以便我可以在本机C++代码中使用它.我该怎么做这样的转换?
我必须在我的一个ASP.NET项目中包含一个(托管的)C++/CLI组件,它自己引用一些其他(非托管)C++ DLL.应该没问题 - .NET 3.5很高兴在编译项目时,一切看起来都很好.C++/CLI组件和其他C++ DLL由另一个部门编译为Visual Studio 2005中带有"Any CPU"的Release版本.安装了VC++ 2005 Redistributable软件包.当我在普通的.NET控制台应用程序中运行它时,相同的代码可以正常工作.
现在,虽然此代码在控制台应用程序中工作,但它没有被ASP.NET正确托管 - 它导致初始页面加载时出错(甚至在进入Global.asax之前).为了测试和调试,我使用了两种机器配置:
在两台计算机上,当我启动ASP.NET应用程序时出现相同的跟随错误:
Exception Details: System.IO.FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[FileNotFoundException: The …Run Code Online (Sandbox Code Playgroud) 在性能监视器中监视我的.NET应用程序我可以看到.NET CLR LocksAndThreads /#当前逻辑线程随着时间的推移而稳步增长(当前为293),这表明线程堆栈正在泄漏.
我可以找到许多文章告诉我这是问题,但没有任何东西告诉我如何找到原因 - 那么我从哪里开始?Windbg可以告诉我问题出在哪里吗?
这是我3小时的性能监视器,告诉我当前的逻辑线程是150:

这是线程窗口的输出,这并没有告诉我太多因为我无法访问他们的调用堆栈 - 它们大多被标记为[不可用]或[在睡眠中,等待或加入] | [外部代码]:
Unflagged 141024 124 Worker Thread <No Name> Normal
Unflagged > 0 0 Unknown Thread [Thread Destroyed]
Unflagged 136272 2 Worker Thread <No Name> Highest
Unflagged 133060 7 Worker Thread vshost.RunParkingWindow [Managed to Native Transition] Normal
Unflagged 136952 10 Main Thread Main Thread [edited].Program.Main Normal
Unflagged 134544 9 Worker Thread .NET SystemEvents [Managed to Native Transition] Normal
Unflagged 136556 11 Worker Thread Worker Thread [edited].MessageService.ProcessJobs.AnonymousMethod__0 Normal …Run Code Online (Sandbox Code Playgroud) 我无法理解如何为C++/CLI项目修复CA2123.这是一个演示该问题的示例项目:
1)创建一个C#(.NET 4)类库
ManagedClass.cs
namespace CSharpLibrary {
public interface IManagedClass
{
void WriteSomething();
}
public class ManagedClass : IManagedClass
{
public void WriteSomething()
{
}
}
Run Code Online (Sandbox Code Playgroud)
}
2)创建C++/CLI控制台应用程序(VS 2010):
AssemblyInfo.cpp
#include "stdafx.h"
using namespace System;
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;
using namespace System::Runtime::InteropServices;
using namespace System::Security;
[assembly:AssemblyTitleAttribute("CPlusPlusCLIConsoleApp")];
[assembly:AssemblyDescriptionAttribute("")];
[assembly:AssemblyVersionAttribute("1.0.*")];
[assembly:ComVisible(false)];
[assembly:CLSCompliantAttribute(false)];
[assembly:SecurityCritical];
Run Code Online (Sandbox Code Playgroud)
CPlusPlusCLIConsoleApp.h
#pragma once
using namespace CSharpLibrary;
using namespace System::Security;
typedef void* (__cdecl FACTORY_PROC)();
namespace CPlusPlusCLIConsoleApp
{
public ref class MainClass : public IManagedClass
{
public:
[SecurityCritical]
virtual …Run Code Online (Sandbox Code Playgroud) 目前,我在 Visual Studio 2013 C++/CLI 本机单元测试中收到以下错误。
error C2338: Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class LTI::IPCommon::CPPBoxesBuffer>(const class LTI::IPCommon::CPPBoxesBuffer &). c:\program files (x86)\microsoft visual studio 12.0\vc\unittest\include\cppunittestassert.h
Run Code Online (Sandbox Code Playgroud)
我已经尝试了 VS2012 中建议的解决方案:单元测试错误:Assert::AreEqual( object, object ) 不起作用并编写了专门化,但它不起作用。
这是 BoxesBuffer.h 中的类:
class CPPBoxesBuffer{
private:
unsigned char* _data;
int _lines;
public:
CPPBoxesBuffer(unsigned char* data, int lines){ _data = data; _lines = lines; };
// Methods for std::map. Class must be Assignable
CPPBoxesBuffer(){ _data …Run Code Online (Sandbox Code Playgroud) c++-cli ×10
.net ×5
.net-4.0 ×2
c++ ×2
visual-c++ ×2
asp.net ×1
boost ×1
boost-thread ×1
c# ×1
clr ×1
dictionary ×1
dll ×1
memory-leaks ×1
static ×1
string ×1
unit-testing ×1
wrapper ×1