标签: c++-cli

如何在C++/CLI的静态变量上使用System :: Threading :: Interlocked :: Increment?

我想在垃圾收集类中保留一个静态计数器,并使用Interlocked :: Increment递增它.这样做的C++/CLI语法是什么?

我一直在尝试以下变化,但到目前为止没有运气:

ref class Foo
{
   static __int64 _counter;

   __int64 Next()
   {
      return System::Threading::Interlocked::Increment( &_counter );
   }

};
Run Code Online (Sandbox Code Playgroud)

c++-cli

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

更改foreach迭代变量和C#与C++/CLI之间的实现差异

请考虑以下C#代码.

string[] stringArray = new string[10];
foreach (string s in stringArray)
    s = "a new string";  // Compiler error - Can't assign to foreach iteration variable
Run Code Online (Sandbox Code Playgroud)

现在考虑以下有效的 C++/CLI代码.

array<String^>^ stringArray = gcnew array<String^>(10);
for each(String^% s in stringArray)
    s = "a new string"; 
Run Code Online (Sandbox Code Playgroud)

foreach与数组类型一起使用时,编译器将其转换为普通for循环.对于C#和C++/CLI,此实现是相同的.所以我想知道C++/CLI是否可以允许这样做,为什么不能用于C#编译器呢?

当类型不是数组时,此错误是有意义的,因为foreach它将被编译为GetEnumerator调用并使用枚举器进行迭代.但我认为可以允许数组类型.

有什么想法吗?

作为旁注,以下是有效的C++/CLI代码,但不会产生预期的结果.

List<String^>^ stringList = gcnew List<String^>(10);
for each(String^% s in stringList)
    s = "a new string"; // I think this should be prevented by compiler …
Run Code Online (Sandbox Code Playgroud)

.net c# foreach c++-cli

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

C++ CLI缺少';' 之前'}'

我正在学习C++/CLI并尝试为我的C#项目构建一个Interop组件.我不确定这个错误意味着什么或如何解决它?有任何想法吗?

#pragma once

using namespace System;

namespace Firewall {

    public ref class Firewall
    {
        void StartFirewall(){};
    }
}
Run Code Online (Sandbox Code Playgroud)

c++-cli

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

来自非托管代码的System.AccessViolationException?

我正在编写这个库,它通过Media Foundation框架在C++/CLI中实现一些基本的音频播放器功能,这些功能将由托管代码使用.我可以播放音频,停止,暂停等等.对于不熟悉Media Foundation的任何人,媒体会话都会发布您可以处理通知的事件.这是通过使用IMFAsyncCallback对象在会话对象上调用BeginGetEvent来完成的.IMFAsyncCallback定义了应该实现的方法Invoke(IMFAsyncResult)来处理事件.发生事件时,调用方法由工作线程上的会话对象调用,该工作线程具有可以查询事件信息的IMFAsyncResult对象.此结果对象由事件线程创建并拥有.

在我的Invoke实现中,每当我尝试用我传递的IMFAsyncResult对象做任何事情(包括只调用QueryInterface或其他东西)时,我都会得到一个System.AccessViolationException.我实现IMFAsyncCallback的对象是在CRT堆上分配的基本C++类(未托管),并且事件发布在也在CRT堆上分配的会话对象拥有的线程上.

  1. 可能导致此异常的原因是什么?

  2. 为什么我从普通旧C++实现的代码中抛出.NET托管异常?这就是当你有一个混合模式组件时会发生什么?

.net c++-cli access-violation visual-c++ ms-media-foundation

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

在C++/CLI中获取dll的模块文件名的首选方法

我有一个C++/CLI DLL,我想知道Win32 API函数的首选替代方案是什么GetModuleFilename.我找到了Assembly::GetExecutingAssembly()->ManifestModule->FullyQualifiedName(MSDN).这似乎有效,但我想知道是否有不同或"更好"的方式.当然,我知道在技术上没有什么禁止我GetModuleFilename直接使用,但我讨厌混合不同的API,这也需要创建一个字符串缓冲区,然后我必须转换回一个System::String.我知道它只有两行代码但仍然...... ;-)

winapi c++-cli

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

命令行参数

我正在努力尝试用Visual生成的C++代码做一些琐碎的事情.这令人沮丧,超出预期.

我习惯于从命令行获取参数,这要归功于:

int main(int argc, char** argv)
Run Code Online (Sandbox Code Playgroud)

好的,这是有效的,至少只要我们留在ANSI世界.

现在,Visual生成了这个:

int main(array<System::String ^> ^args)
Run Code Online (Sandbox Code Playgroud)

关于如何使用这条线,我有点无能为力.我显然试图将未知语义与更熟悉的语义交换,但编译失败.我也一直在互联网上漫游大量的时间,为这种情况找到了很多例子,但是没有一个能够工作......

[编辑]关于我正在尝试做什么的小解释:这应该是一个微不足道的GUI程序.它从命令行参数获取文件路径,并根据用户在GUI上选择的选项写入.所以:它不是CLI,它是一个Windows窗体.

c++-cli visual-c++

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

将std :: string或string ^转换为c ++/cli中的字节数组

我知道这是一个经常被问到的问题,我没有明确的答案将std :: string或String ^转换为字节数组,以便写入流进行tcp通信.

这就是我尝试过的

bool CTcpCommunication::WriteBytes(const std::string& rdatastr)
{
  bool retVal = false;

  try
  {
    if (static_cast<NetworkStream^>(stream) != nullptr)
    {
      array<Byte>^data = System::Text::Encoding::ASCII->GetBytes(rdatastr); 
      stream->Write( data, 0, data->Length ); 
    }
  }
  catch(Exception^)
  {
    // Ignore, just return false
  }
  return retVal;
}
Run Code Online (Sandbox Code Playgroud)

我知道这里GetBytes不会工作,我也检查了编组选项,将std:string转换为.NET String但是没有发现任何.有人帮我解决这个问题.

.net sockets string c++-cli tcpclient

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

如何在.net CLR应用程序中的C++中的索引处替换String ^中的字符?

我有一个String ^变量.这是一个字符串,我想替换它中第i个位置的字符.我看过他们使用StringBuilder的C#示例.什么适用于C++?

我在Windows 7上使用VS 2012.

.net c++-cli visual-studio

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

如何在c ++/CLI应用程序中显示控制台?

我正在VS 2012中进行c ++/CLI应用程序分配.出于测试目的,我正在尝试将一些输出打印到控制台(在构建它们时测试方法),但是这个Windows窗体应用程序没有控制台窗口.有没有办法让控制台窗口显示?

或者有没有人建议如何显示方法输出/结果?

谢谢.

编辑 - 我想出了如何使控制台窗口工作.感谢大卫的回应.

.net testing c++-cli output

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

cvtColor在转换时崩溃

我将带有外部dll的相机加载到我的OpenCV程序中.我可以看到框架 cv::imshow("edges", frame);,一切都很好.frame.channels()给了我3个频道,但是当我尝试cv::cvtColor(frame, gray, CV_BGR2GRAY);应用程序崩溃时.

CreateImage(System::Byte *imgData, int height, int width,int show)
{

    frame = cv::Mat(height, width, CV_8UC3, imgData);

    if (show > 0)
        cv::imshow("edges", frame); //I can see myself

    return frame.channels(); //three channels
}

void ConvertAndProcess()
{
    cv::Mat gray;

    cv::cvtColor(frame, gray, CV_BGR2GRAY); //crash...

    //do something
}
Run Code Online (Sandbox Code Playgroud)

我已经挖了一段时间但没有结果.我究竟做错了什么?

opencv c++-cli

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