如何在C++/CLI中定义ref
在C#中,我们可以写:
public override void myfunction(TokenStream tokenStream, ref string outliningKey,
ref OutliningNodeAction tokenAction);
因此,在C++/CLI中,我尝试编写:
public:virtual void myfunction(TokenStream ^ tokenStream,
ref String ^ out
我是c++/cli新手。在混合代码的c++文件中,我有一个本机指针I1*。I1是一个COM接口。我想将本机指针转换为I1^。强制转换会引发错误。我希望使用类似IntPtr的东西,而不是I1^使用。强制转换返回值。Hi Hans,Marshall::GetObjectForIUnknown需要一个IntPtr。当只存在本机指针时,正确的调用方法是什么IntPtr((void*)nativePtr)似乎不起作用。
只要它在同一个组件中并在同一个项目中使用,它就可以正常工作
但是当我尝试从另一个项目引用该项目,并从那里启动一个引用对象的ref类时,它将无法正确识别类型,也无法识别正确的构造函数
>如何解决这个问题?< P>我认为在这个例子中你不能使用C++对象,但是你可以通过将它存储在一个C++代码对象中,将它存储在一个代码中,将它存储在一个 ItpTrt/Cube >中,然后使用 StasyCase> < /C> >检索它。
class nativeA; // Pre declaration
A (I
因此,我在动态地向menuStrip添加项时遇到了问题。我的意思是,我知道如何向其中添加项目,但我不知道如何为那些动态添加的项目创建单击处理程序
for(int i = 0; i < grupiuKiekis; i++)
{
row2 = mysql_fetch_row(result2);
System::String^ grupesName = gcnew String(row2[1]);
pasirinktiGrupęToolSt
我导入两个WinApi函数并在类中使用它们
using namespace System::Runtime::InteropServices;
[DllImport("user32",ExactSpelling = true)]
extern bool CloseWindow(int hwnd);
[DllImport("user32",ExactSpelling = true)]
extern int FindWindow(String^ classname,String^ windowna
我有两个类,A.h.包含
public ref class A
{
public:
A(void);
B ^_ObjB;
}
在A.cpp中,我使用了类B中的方法,使用了_ObjB->Method()
现在在我的类B中,我有一些方法需要调用类A中的方法,所以我尝试用以下方式声明它-
public ref class B
{
public:
B(A);
A ^_ObjA;
}
显然,这不是正确的方法,所以它会抛出错误。我想知道我该怎样才能达到这个要求?< P>和你在常规C++中所做的一
那么,确保运行这些本机类的最佳方法是什么。。。嗯,天生的
我应该:
将pragma非托管添加到每个本机类的顶部
B只需在单个CLI类中的includes之前添加pragma unmanaged
C还有别的吗?
谢谢我这样做的通常方法是将本机代码放入一个静态库项目中,而不使用.NET支持编译而不使用/clr。您可以为C++/CLI项目中的单个文件关闭/clr,但预编译头会变得非常混乱。使用单独的库项目,可以很容易地为本机代码设置本机pch,为托管代码设置托管pch
>我将C++和CLI代码与原生
我最近安装了VS2015。耶\o/
但是,从VS2013升级时,我的一个C++/CLI项目显示了以下消息:
下面的项目使用Visual C++编译器和库的早期版本。该项目将升级为使用Microsoft Visual Studio 2015编译器和库任何使用C++/CLI扩展的托管或本机代码项目都将自动升级到目标.NET Framework 4.5.2。注意:如果不升级项目,生成项目将需要安装相应版本的Visual Studio
我同意警告,但现在以前在VS2013中编译的代码不再编译,例如:
v
首先,我的代码:
#include <iostream>
#include <thread>
#using <System.dll>
using namespace System;
using namespace System::IO::Ports;
using namespace System::Threading;
int main()
{
SerialPort^ mySerialPort = gcnew SerialPort("CO
提前感谢我不是一个巨大的C++/CLI程序员,但是下面的内容应该可以很好地工作
IntPtr p = GetTheIntPtr();
char* pChar = reinterpret_cast<char*>(p.ToPointer());
IntPtr p=gettheintpr();
char*pChar=reinterpret_cast(p.ToPointer());
IntPtr类有一个名为ToPointer的方法,它以void*类型返回地址。在C++/CLI中可转换为c
我在c++/CLI库中有以下代码,用于捕获非托管异常并重新引用它们:
catch(const std::exception &e)
{
String ^errorMessage = String::Format(L"Parser threw exception: {0}", gcnew String(e.what()));
throw gcnew ApplicationException(errorMessage);
}
这是最好的方式吗?这样我似乎丢失了很多信息 我假
我试图在CLI/C++程序中跟踪托管对象的创建/处置:
::System::Diagnostics::Trace::WriteLine(String::Format(
"Created {0} #{1:X8}",
this->GetType()->Name,
((UInt64)this).ToString()));
这与
错误C2440:“类型强制转换”:无法从“MyType^const”转换为“unsigned\uu int64”
有没有一种方法可以通过
为了在托管代码中使用非托管代码,您将如何构建一个包装器,以及何时必须这样做?您通常不需要包装器,许多直接导出C函数的DLL都可以使用[DllImport]属性进行pinvok。C导出的一个例外是设计糟糕的DLL,它需要客户端代码释放内存,而托管代码无法这样做,因为它无法访问分配器
您必须拥有包装器的情况是本地C++类。托管代码不能直接pinvoke它,因为它不知道如何创建类的实例(这需要知道对象的大小并调用构造函数),也不知道如何销毁它(这需要调用析构函数)。在C++/CLI中很容易做到这一点。
您需要使用相同的运行时库设置构建两个模块,或者只需要在模块边界之间传输POD类型。坏消息并不常见。我不会将此作为答案提交,但如果您非常绝望,并且类是通过指针而不是值返回的,在程序执行过程中,您确定只调用这个方法几次,那么您就不能简单地删除这个类。它会泄漏,但也许这是可以接受的。正如@ildjarn所指出的,真正的答案显然是修复应用程序配置。此外,无法保证矢量访问操作将来会在不同的CRT上工作。感谢ildjarn和David的回复。我现在已经用指针代替了向量。因为我知道大小,所以我正在创建原始向量
在现实中,C++/CLI什么时候是一个好的选择?
它的好处是什么?使用C++/CLI的唯一原因是您可以在托管应用程序中使用本机库。甚至微软也表示,它不应该单独使用:
使用C++/CLI的第二个主要考虑事项是记住
这只是作为托管服务器和本机服务器之间的桥梁
世界,而不是你用来写批量的技术
你的申请。这样做当然是可能的,但你会
发现开发人员的生产率比纯C++低很多
纯C#/Visual Basic环境,并且应用程序运行频繁
启动速度较慢。因此,当您使用C++/CLI时,只编译您需要的文件
需要使用/
标签: C++ Cli
nativedllimportmixed-mode
我试图在C++/CLI中编写一个包装器dll,以使用C#中的一些本机类
为了进行测试,我创建了另一个使用dll的C++/CLI项目
我的问题是,我想在测试项目中使用dll项目中的一个本机类,但链接器抱怨它没有找到此类成员的符号。
我猜这是因为本机类没有定义refpublic。由于本机类代码是由Google Protobuffers编译器自动生成的,因此我无法向其添加ref public
不要误解我,我不想在未来的C++项目中使用这个本地类,但是我想直接在测试项目中访问它。 < P>我认为你必须遵
请告诉我如何将CStringArray*转换为C++/CLI数组。我正在创建一个包装dll,它需要将我的数据转换为非托管代码。我可以使用double*之类的基本数据类型,但不能用于CStringArray*
谢谢。这是解决方案
#include <msclr/marshal.h>
#include <msclr/marshal_cppstd.h>
#include <msclr/marshal_atl.h>
CStringArray * myData; /
我有一个打开窗口的本机函数。它需要父窗口的句柄:
void open(void* parentHwnd);
如何将父窗口从托管代码传递到此函数?我试着这样做:
void managedOpen(Object^ parent)
{
interior_ptr<void> ptr = &*parent);
open(ptr);
}
void managedOpen(IntPtr parent)
{
open(parent.ToPointer());
}
vo
但是,我得到了编译器错误:无法从cli::interior\u ptr转换到void**。
我已经做了一些研究,这看起来是C++和C++中CLI的不同类型的指针的问题。任何人都知道这一点,也许还有一点关于如何修复它的建议?先走一步
首先,谢谢你的帮助
正如Freich所建议的,我尝试使用pin\u ptr,但这反而使编译器抱怨从interior\u ptr转换到pin\u ptr时出现问题。如果我改为尝试使用内饰\u ptr,如中所示:
pin_ptr<void *> pinnedP
我有一个头文件,它包含在本机cpp文件和托管cpp文件(使用/clr编译)中。它只包括本机类型,但我想指定本机类型在程序集外部可见
(见附件)
基本上,我想要:
public class NativeClass // The public makes this visible outside the assembly.
{
};
如果从本机cpp中包含此代码,则会出现以下错误:
error C3381: 'NativeClass' : assembly access specifiers
我有一个c++-cli函数,它的输入参数是字符串字典
Locate(Dictionary<String^, String^>^ Dic)
定位(字典^Dic)
有时正在传递的Dic是空的。第一个字符串或第二个字符串中根本没有条目。如何检查字典Dic是否完全为空?我知道TryGetValue只有在第一个字符串存在时才起作用
谢谢。您可以查看酒店:
bool isEmpty = Dic->Count == 0;
我从未使用过CLI,但对字典容器的快速MSDN搜索显示它有一个
我得到了一个第三方C/C++库(.dll、.lib、.exp和.h),我需要在我们的C#应用程序中使用它
第三方图书馆.h包含
class AClass {
public:
typedef enum {
green = 7,
blue = 16
} Color;
virtual int GetData()=0;
virtual int DoWork(Color, char *)=0;
};
void * Func1(int, AClass **aCla
我一直在尝试从这里开始翻译,以便在C++-cli项目中运行。就intellisense而言,以下内容看起来不错:
static String^ TrimAllWithInplaceCharArray(String^ str)
{
unsigned int len = str->Length;
array<wchar_t, 1>^ src = str->ToCharArray();
int dstIdx = 0;
for (unsigned
这是VS 2012中创建的头文件中的C++/CLI代码,我们将假定该头文件在当时可以工作
namespace CLIWrapper {
public ref class Wrapper
{
public:
static bool call_calculator(double* liquids, double* solids, double temperature, int arraySize);
static
由于我几乎没有什么想法,而且谷歌的搜索结果现在已经达到了10点或更少,我现在转到这里,希望看到答案,或者至少是一条线索,引导我找到实际的解决方案
我正在创建一个可以作为可执行文件、非静态库和静态库分发的项目。
我想在WPF项目(C#)中使用该库,这就是为什么我创建了一个简单的CLR包装器
在基础库引入最新的更改之前,所有这些都工作得非常好。
现在,我在库项目中对“main”类的所有调用中都出现了链接错误(总共5个):
1>wrapper.obj : error LNK2028: unres
我在使用VisualStudio2008时遇到了一些问题,正在尝试连接到RESTAPI。我在C代码中做过这项工作,但是由于我的代码结构,所有的C++,我想用C++来做。我以前做过这类事情,没什么麻烦
但是有了这个,我被卡住了。HttpWebRequest显然是System::Net的一部分,但编译器一直说它不是System::Net的成员,或者它是“未声明的”,这取决于我对它的编码方式。我在web上找到了一些使用C++/CLI实现这一点的示例,但没有一个适合我
我希望我错过了一些简单的事情。我想
标签: C++ Cli
xmlserializerinvalidoperationexception
我上传了一个ZIP文件,其中包含我试图读取的XML文件和相应的XSD文件
我正在尝试使用XmlSerializer反序列化以下XML(片段)。在这样做的时候,我得到了错误:(抱歉是德语,我会用斜体字粗略翻译)
System.InvalidOperationException==>Fehler im XML Dokument(90,7)。
System.invalidoOperationException=>Der angegebene-Typ-wurde-nicht-erkannt:Name='
谁能告诉我这两行代码之间的区别是什么,哪一行更好用
System::String ^MyStr = gcnew System::String(MyStr);
System::String ^MyStr;
这些线并不相等。在第一个示例中,您将得到一个异常,因为您试图从未初始化的跟踪句柄(MyStr)创建字符串。在第二个示例中,MyStr是声明的,而不是定义的,它指向垃圾,如果您试图使用它,它将抛出一个异常。您应该使用哪一个取决于代码的其余部分第二个将创建一个新的句柄变量。如
我一直在考虑如何使用FileSystemWatcher检测文件夹下载是否已完成。到目前为止,我所取得的成就是,我能够检测到此文件夹的创建,然后触发一个监视程序,监视此监视程序内的更改。每当在此文件夹中创建文件时,我都会尝试访问它并检查它是否已锁定
问题是:如何知道此文件夹中的所有文件都已写入
我知道我可以单独处理每个文件,但如何从这一点到一个包罗万象的结果呢
我需要这个,因为在文件夹完全写入之后,我会将其存档,并将其上传到FTP
这是我目前拥有的代码:
static void OnChanged
标签: C++ Cli
directx-11direct2ddirectx-10spritefont
我需要在direct 3d 10.1设备和direct 3d 11设备之间共享曲面,以允许我的应用程序在diirect 2d和direct 3d 10.1之间渲染Sprite共享曲面。
我读过这个话题
但只有d2d和d3d 10.1之间的共享示例,而不是d3d 10.1和11之间的共享示例,有人能给我一个代码示例吗?不同DirecX设备之间的表面共享是通过和完成的
另一个答案更详细地解释了这个过程
我已在ildasm中禁用了以下C++/CLI代码:
Managed(char * const a)
{
}
拆下的IL如下所示:
.method public hidebysig specialname rtspecialname
instance void .ctor(int8 modopt([mscorlib]System.Runtime.CompilerServices.IsSignUnspecifiedByte)* modopt([mscorlib]System.
第一:我已经在SO和其他网站上阅读了几十篇,甚至近百篇关于对象引用未设置为对象实例的其他帖子,我得到的印象是这显然是一个常见错误,但我似乎不明白。所以,如果这是一个简单的错误或愚蠢的问题,我很抱歉,但我是C++/CLI新手,我已经在这方面停留了很长时间,我完全被难住了。我对这个问题的具体解释可能已经在其他地方得到了回答,但我要么找不到,要么确实找到了,但我没有足够的理解,不知道到底需要解决什么或如何解决=
我遇到运行时错误崩溃:
"Unhandled Exception: System.Null
我有一个需要混淆的C++/CLI程序。我在我的C#程序中使用ConfuserEx,它工作得很好,但是当我在C++/CLI程序中使用它时,我运行程序,我只得到旋转指针,然后它就消失了。似乎什么都没有打开
瑟米达为它工作,但我现在没有钱支付。是否有解决此问题的方法,或者有支持混合模式程序集的廉价/免费替代方案
谢谢我最近了解了“eazfousator.NET”,但无法证明它的工作情况如何。
当T是值类型时,是否可以获取对System::Collections::Generic::List元素的引用
以下生成警告C4172,因为索引器返回的值是临时副本
value struct
PluginInfo
{
//...
};
List<PluginInfo^ pluginInfos = gcnew List<PluginInfo>();
PluginInfo%
GetPluginInfo(Handle handle)
{
for (i32 i = 0
标签: C++ Cli
visual-studio-2019clang-format
我目前尝试使用clang格式(版本9.0.0)格式化C++/CLI代码。我不知道如何处理每个语句的
之前:
for each (auto i in I)
{
}
之后(例如,Visual Studio中的CTRL-K/CTRL-D):
我读到:
…您可能希望将ForEachMacros更改为添加“for each”
我试过这个:
ForEachMacros:
- for each
- foreach
- Q_FOREACH
- BOOST_FOREACH
那么这个,
ForE
sealed可以使用私有构造函数和某种工厂模式(实际获取sealed类的实例)。在Visual C++中,有两个例子,< P>在VS 2005中是有效的。它提供了额外的编译时验证,界面看起来和闻起来都应该这样。(链接的MSDN文章提供了全部详细信息。)
但是,在C++ C++实现中,只是“C++托管扩展”的一部分。不过,当前版本的Microsoft编译器也会这样做,但这是一个在其他地方可能永远找不到的扩展
请注意,MS做了一些类似于覆盖——它是MSVC中的一个关键字扩展,表示函数打算覆盖基类虚拟
可以在.h和.cp文件中定义,还是必须在一个.h文件中定义?< p>您可以在.h中定义,或者像传统C++一样定义类定义。
请注意,对于属性,您需要使用适当的作用域嵌套get和set方法,例如:
void MyModel::AProperty::set(bool b)
{
mBackingVariableForAProperty = b;
}
应注意的是,所有通常的限制均适用;特别是,不可能只在两个头文件中定义使用彼此方法的两个类。顺便说一句,如果只在.h文件中定义,函数是否都是内联函数
如果我使用/clr模式编译具有以下内容的代码:
int x = 3;
char ch='A';
int arr[]="Hi";
array<int>^ ManArr1={44};
array<int>^ ManArr2= gcnew array<int> {44};
intx=3;
char ch='A';
int arr[]=“Hi”;
数组^ManArr1={44};
数组^ManArr2=gcnew数组{44};
我现在的问题是:
类型int是否映射
标签: C++ Cli
mouseeventdragonmousedowndrawrectangle
我调试这个程序有困难。我试图模仿微软桌面上的功能,你可以把它拖成一个矩形。
我们希望使其:
1.要开始绘制矩形,请按下鼠标。
2.通过向下拖动矩形,可以创建矩形的形状和大小。
3.松开鼠标即结束矩形的绘制
4.我们希望能够跟踪起点和终点。
到目前为止,我们已经
这是getRect函数:
我们遇到的问题是,矩形一直在移动,好像它没有将第一次单击图像的位置作为其位置一样 找出了问题所在:
这不是C++。将语言更改为C++/CLI。
private: System::Void pictureBox
除了使用以下选项,还有其他选择吗
class IGraphBuilder;
public ref class Device
{
private:
IGraphBuilder* pGraphBuilder;
public:
void Configure()
{
pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder;
HRESULT hr = CoCreateI
我是C++/CLI新手,我想知道关于托管类型数据成员的“最佳实践”是什么。声明为句柄:
public ref class A {
public:
A() : myList(gcnew List<int>()) {}
private:
List<int>^ myList;
};
public ref A类{
公众:
A():myList(gcnew List()){}
私人:
列表^myList;
};
或作为一个值:
public ref class
如何删除显示“回车”的键??我希望当用户输入并删除此输入键时,程序显示“Plase enter Espace或Tab”。谢谢大家!
private: System::Void richTextBoxCommentaire_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyValue == (char)13)
{
我希望我的标签对象显示一个字符串或整数,但我似乎找不到问题
"System::Windows::Forms::Label::Text::set" cannot be called with the given argument list
参数类型为(std::string)
函数类型为System::Windows::Forms::Label^
滚动到我的节目的最后,看看我在说什么
#pragma once
#include <string>
#include <sstre
如何准确转换:
array<BYTE>^ mntest = gcnew array<BYTE>{0x1A, 0x1B, 0x1C};
to
BYTE unmtest [] = { 0x1A, 0x1B, 0x1C };
array^mntest=gcnewarray{0x1A、0x1B、0x1C};
到
字节unmtest[]={0x1A,0x1B,0x1C};
分别。如何初始化非托管字节数组以更正托管数组的大小。
非托管数组的动态初始化引发错误。我发现静态数组的动态
它给出了以下错误:
1>.\main.cpp(3) : warning C4805: '==' : unsafe mix of type 'System::Boolean ^' and type 'bool' in operation
1>.\main.cpp(3) : error C2446: '==' : no conversion from 'int' to 'System::Boolean ^'
1> No user-defined-conversion
我希望能够使用包装器在C#中调用函数,如下所示:
Packet.Write(1234);
数据包写入(1);
但是,我无法编译我的包装器。错误:
错误1错误C2664:“void System::IO::BinaryWriter::Write(System::String^)”无法将参数1从“T”转换为“bool”
我不理解这个错误,System::String^来自哪里。我看到很多Write()方法的重载,CLI/C++是否调用了正确的方法,如果是,如何使其调用正确的方法
参考MSDN:模板
如何覆盖C++/CLI函数?查看OpenCV的git,准确地说,您可以找到:
CV_INLINE int cvRound( int value )
{
return value;
}
因此,函数已经为整数重载,并且它不会隐式地将int转换为double。查看OpenCV的git,确切地说,您可以发现:
CV_INLINE int cvRound( int value )
{
return value;
}
因此,函数已经为整数重载,并且它不会隐式地将int转换为double。
标签: C++ Cli
win-universal-appwindows-10-universalwindows-10-desktop
基本上,当试图更改托管类(UWP)的变量时,它会崩溃。此外,似乎只有在尝试修改使用应用程序名称空间创建的变量时才会崩溃。换句话说,如果我创建一个新的namspace和managed类,我就可以很好地修改变量
但这个是
all_item->Title = "All";
我几乎可以肯定,它与应用程序默认名称空间中的应用程序以及在主线程之外访问的应用程序有关。。。至少看起来是这样的,因为这是除了实际课程之外唯一的区别
这是通用_项的外观
[Windows::UI::Xaml::Data::B
是否可以从Windows上的.NET Core 2应用程序使用.NET C++/CLI DLL
我有一个用v4.6.1构建的DLL。从.NET Core测试应用程序中,我执行以下操作:
Assembly.LoadFrom("mycliassembly.dll");
我收到这个例外:
无法加载文件或程序集。。。可执行文件(.exe)的格式或
库(.dll)无效
所以显而易见的答案是否定的。但是。。有没有办法,假设我们只讨论Windows?好的,根据链接的问题,最好的答案来自[:
“据我所知,没有
我想知道如何在C++/CLI托管代码中声明无符号类型的IEnumerable?
我尝试了很多搜索,甚至出现了堆栈溢出,但找不到任何我能理解的东西
我正在尝试:
IEnumerable^<unsigned int> msgs = client->GetMessage(uids, true, nullptr);
IEnumerable^msgs=client->GetMessage(uids,true,nullptr);
但是它说没有模板。如果是它的模板,那么例如:IEnume
上一页 1 2 3 4 5 6 7 8 9 ...
下一页 最后一页 共 23 页