我想在垃圾收集类中保留一个静态计数器,并使用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#代码.
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) 我正在学习C++/CLI并尝试为我的C#项目构建一个Interop组件.我不确定这个错误意味着什么或如何解决它?有任何想法吗?
#pragma once
using namespace System;
namespace Firewall {
public ref class Firewall
{
void StartFirewall(){};
}
}
Run Code Online (Sandbox Code Playgroud) 我正在编写这个库,它通过Media Foundation框架在C++/CLI中实现一些基本的音频播放器功能,这些功能将由托管代码使用.我可以播放音频,停止,暂停等等.对于不熟悉Media Foundation的任何人,媒体会话都会发布您可以处理通知的事件.这是通过使用IMFAsyncCallback对象在会话对象上调用BeginGetEvent来完成的.IMFAsyncCallback定义了应该实现的方法Invoke(IMFAsyncResult)来处理事件.发生事件时,调用方法由工作线程上的会话对象调用,该工作线程具有可以查询事件信息的IMFAsyncResult对象.此结果对象由事件线程创建并拥有.
在我的Invoke实现中,每当我尝试用我传递的IMFAsyncResult对象做任何事情(包括只调用QueryInterface或其他东西)时,我都会得到一个System.AccessViolationException.我实现IMFAsyncCallback的对象是在CRT堆上分配的基本C++类(未托管),并且事件发布在也在CRT堆上分配的会话对象拥有的线程上.
可能导致此异常的原因是什么?
为什么我从普通旧C++实现的代码中抛出.NET托管异常?这就是当你有一个混合模式组件时会发生什么?
.net c++-cli access-violation visual-c++ ms-media-foundation
我有一个C++/CLI DLL,我想知道Win32 API函数的首选替代方案是什么GetModuleFilename.我找到了Assembly::GetExecutingAssembly()->ManifestModule->FullyQualifiedName(MSDN).这似乎有效,但我想知道是否有不同或"更好"的方式.当然,我知道在技术上没有什么禁止我GetModuleFilename直接使用,但我讨厌混合不同的API,这也需要创建一个字符串缓冲区,然后我必须转换回一个System::String.我知道它只有两行代码但仍然...... ;-)
我正在努力尝试用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窗体.
我知道这是一个经常被问到的问题,我没有明确的答案将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但是没有发现任何.有人帮我解决这个问题.
我有一个String ^变量.这是一个字符串,我想替换它中第i个位置的字符.我看过他们使用StringBuilder的C#示例.什么适用于C++?
我在Windows 7上使用VS 2012.
我正在VS 2012中进行c ++/CLI应用程序分配.出于测试目的,我正在尝试将一些输出打印到控制台(在构建它们时测试方法),但是这个Windows窗体应用程序没有控制台窗口.有没有办法让控制台窗口显示?
或者有没有人建议如何显示方法输出/结果?
谢谢.
编辑 - 我想出了如何使控制台窗口工作.感谢大卫的回应.
我将带有外部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)
我已经挖了一段时间但没有结果.我究竟做错了什么?