标签: c++-cli

要断言在Visual C ++单元测试中工作?

我在Visual C ++项目中使用Visual Studio 2008的内置测试框架。我要添加一个新的测试项目,然后是一个新的单元测试。但是,我不能使用Assert提供的任何功能。断言会出现在Intellisense中,但我对此无能为力。我已经在Visual C#中完成了单元测试。我忘了做什么吗?

编辑:没有太多的代码,因为我正在做的一切都是由Visual Studio 2008自动生成的。这是我正在做的步骤:

  1. 文件->新项目-> Visual C ++->常规->空项目
  2. 在解决方案资源管理器中右键单击解决方案->添加->新项目...
  3. Visual C ++->测试->测试项目
  4. 打开UnitTest1.cpp(自动生成)
  5. 转到TestMethod1()

从这里开始,当我尝试使用Assert类(如Assert.AreEqual)时,我做不到。如果我在Visual C#项目中执行相同的操作,则效果很好。

unit-testing c++-cli visual-studio-2008

2
推荐指数
1
解决办法
1686
查看次数

2
推荐指数
1
解决办法
2344
查看次数

C++/cli识别托管/非托管之间的转换并测量其成本

我仍然是C++/cli的新手,并不总是确定我什么时候写一些东西是否正在做一些在托管和非托管运行时之间创建转换的东西.例如,我不能将LARGE_INTEGER或std :: vector添加为托管类的成员,但我可以在托管方法的中间使用,但我不知道这样做是否会在托管和非托管之间创建转换运行时间.如何看待我强制进行过渡的每个点,以及如何衡量这些过渡的成本?

我遇到的一种可能性是,我希望在Windows中存在"过渡到非托管"和"过渡到托管"代码块.那些我可以设置断点的符号,例如windbg,所以我可以看到每个转换?有没有办法让visual studio在运行时显示每个转换?

要在有许多转换的情况下测量inpact,是否有我可以用xperf看到的windows事件的相应事件跟踪,或者我可以用perfmon看到的性能计数器?

.net performance windbg c++-cli visual-c++

2
推荐指数
1
解决办法
903
查看次数

如何从C#代码中调用具有int*类型参数的C++ DLL中定义的函数?

我有一个原生的常规C++ Dll,我想从C#代码调用,所以我创建了C++/CLI类(如这里这里所述),它将包含托管C++代码,可以直接调用任何C#代码,哪些可以生成调用inturn到本机非托管C++.

本机C++ dll中的一个函数具有int*类型的参数.如何在包装函数中声明,如何将其转换为int*?

c# c++-cli

2
推荐指数
1
解决办法
669
查看次数

C ++ / CLI串口发送命令

我这里有硬件,它可以通过串行端口进行通信。我使用MS Visual C ++ 2010,并且要发送命令:<-S->

我正在这样做:

SerialPort^ serialPort = gcnew SerialPort(portName , 9600, Parity::None, 8, StopBits::One);
serialPort->Open();
serialPort->WriteLine("<-S->");
serialPort->Close();
Run Code Online (Sandbox Code Playgroud)

但是发出的命令是<-S->.,而不是<-S-> (请注意传出命令的附加点)。我使用免费的串行端口监视器来监视我的传入/传出数据。

那么我该如何摆脱这一点<-S->.呢?

这是怎么回事:

3C 2D 53 2D 3E 0A = <-S->。

这就是我要的:

3C 2D 53 2D 3E = <-S->

感谢帮助。

c++-cli visual-studio-2010

2
推荐指数
1
解决办法
5712
查看次数

C++问题中的例外

我有这个代码:

try
{
    files = Directory::GetFiles(path);
}catch(int){ 
    MessageBox::Show("Error getting files.");
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行它并GetFiles崩溃时,它仍会报告未处理的异常.为什么?

c++-cli exception

2
推荐指数
1
解决办法
161
查看次数

c ++/cli自定义异常 - 标准构造函数

试图从C++/CLI库中避免FxCop警告"不要引发保留的异常",所以我决定分解并编写自己的异常类型.

[Serializable]
public ref class CaptureException : public Exception
{
public:
    CaptureException() : Exception() {}
    CaptureException(String^ message) : Exception(message) {}
    CaptureException(String^ message, Exception^ inner) : Exception(message, inner) {}
protected:
    CaptureException(System::Runtime::Serialization::SerializationInfo^ info, System::Runtime::Serialization::StreamingContext^ context) : Exception(info, context) {}
};
Run Code Online (Sandbox Code Playgroud)

这不会编译说明

error C2664: 'System::Exception::Exception(System::String ^,System::Exception ^)' : cannot convert parameter 1 from 'System::Runtime::Serialization::SerializationInfo ^' to 'System::String ^'
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我会收到这个错误.C++/CLI没有完整的异常类吗?我只是尝试为我的异常实现标准构造函数,在C#中它看起来像这样并且编译得很好.

[Serializable]
public class CaptureException : Exception
{
    public DatabaseConnectionException() { }
    public CaptureException (string message) : base(message) { }
    public CaptureException (string message, Exception …
Run Code Online (Sandbox Code Playgroud)

c++-cli .net-4.0

2
推荐指数
1
解决办法
1715
查看次数

Windows窗体应用程序中使用C ++ / CLI的命名空间混乱

我试图通过利用using namespaceWindows Forms项目节省一些编码时间。我在VS2010中使用C ++ / CLI创建了默认的Windows Forms项目。我注意到导入的默认名称空间是:

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
Run Code Online (Sandbox Code Playgroud)

我想创建一个DialogResult-typed变量,它(足够方便!)位于System::Windows::Forms命名空间内。我进入默认的构造函数Form1并添加以下行:

DialogResult dr;
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误syntax error : missing ';' before identifier 'dr'

但是,如果我将行更改为:

Windows::Forms::DialogResult dr;
Run Code Online (Sandbox Code Playgroud)

要么

System::Windows::Forms::DialogResult dr;
Run Code Online (Sandbox Code Playgroud)

然后一切都会按预期进行。

我也尝试添加

using namespace System::Windows;
Run Code Online (Sandbox Code Playgroud)

然后

Forms::DialogResult dr
Run Code Online (Sandbox Code Playgroud)

也可以!

这些命名空间的工作方式我缺少什么?我想避免必须完全限定我正在编写的所有代码,但是由于我应该已经导入了所需的名称空间,所以我无法弄清楚我在做什么错。

.net c++-cli visual-studio-2010 winforms

2
推荐指数
1
解决办法
2525
查看次数

从C#调用者中的非托管DLL捕获stdout

我有一个C#应用程序通过一些C++/CLI编组代码调用本机C++ DLL:

C# - > C++/CLI - > C++(无CLR)

我希望DLL在运行时将字符串更新发布回调用应用程序.目前,非托管DLL将输出写入stdout.基本上我需要在UI中捕获此输出.

在我正在炮轰非托管exe的其他情况下,这可以通过简单地将stdout从被调用者重定向到绑定到文本面板的UI数据中的字符串缓冲区来实现.

我没有选择使用P/Invoke调用DLL或将其作为exe来shell,因为互操作层执行非基本类型的基本编组.非托管DLL没有CLR支持,必须保持这种方式.

我不得不使用委托(有限的成功http://msdn.microsoft.com/en-us/library/367eeye0(v=vs.100).aspx),因为似乎总是地方,托管和非托管世界的碰撞.取的示例中的链接,从C/CLI传递一个管理委托伪装成本地函数指针到DLL的工作原理,但回调是C++/CLI类的范围之外定义,因此不能访问来自传入的一个托管委托调用层(C#).

理想情况下,我想定义一个接受非托管字符串的类,并可以将这些字符串转换为托管并回调到UI层,但如果此类具有对托管字符串的必要支持,则无法将其传递给非托管代码.

我可能错过了一个简单的重定向技巧,它允许捕获stdout而不在层之间传递字符串(例如,从通过委托接收的C++/CLI重定向stdout).如果这是不可能的,任何人都可以提出替代技术吗?

托管C++:

using namespace System::Runtime::InteropServices;
using namespace System;

namespace BusinessObjectInterop
{
    typedef void (__stdcall *UnmanagedFP)(std::string);

    //Callback function
    public delegate void SetProgressDelegate(std::string);  


    void SetProgress(std::string s) {
        Console::WriteLine(s);

        //set m_progress - could use managed delegate passed from UI and exposed in static method in CIntermediate?
    }

    public ref class CIntermediate       
    {
    public:

        //Invoked by managed (C#) UI
        void ^ CallBusinessObject(Object ^ data, String ^ progress)
        { …
Run Code Online (Sandbox Code Playgroud)

c# c++-cli stdout io-redirection

2
推荐指数
1
解决办法
2561
查看次数

固定大小的字节数组

public : array<Byte>^ Foo(array<Byte>^ data)
Run Code Online (Sandbox Code Playgroud)

获取动态大小托管数组

但是如何获得固定大小的托管字节数组呢?

我想强迫C#用户发送8字节数组; 并获得8个字节

样式:

public : Byte[8] Foo(Byte[8] data)
Run Code Online (Sandbox Code Playgroud)

编辑:

任何人都可以解释为什么它在安全环境中的不可能性?

.net c# c++-cli

2
推荐指数
3
解决办法
3675
查看次数