Tag: c ++ cli

如何在托管C ++中捕获非托管C ++exception

我正在一个大型非托管C ++库和一个大型C#库上开发一个瘦托管C ++包装器。 我需要捕获源自大型非托管C ++库的错误,并将它们重新抛出为Clrexception。 非托管库抛出以下类的实例: Error::Error(const std::string& file, long line, const std::string& function, const std::string& message) { message_ = boost::shared_ptr(new std::string( format(file, line, function, message))); } const char* Error::what() const throw () { return message_->c_str(); } 到目前为止,我已经想出了这个: try{ // invoke some unmanaged code } catch(Object*) { throw gcnew System::Exception(“something bad happened”); } 如何从Error类中提取消息并将其转换为Clr String类,以便我可以将它传递给gcnew […]

依赖于C ++ / CLI的任何CPU依赖于本机C dll(c ++ / cli的任何cpu)

这是我的问题。 我在C#中包装一个C dll。 为此,我首先编写了一个C ++ / CLI包装器。 本机C库链接到C ++ / CLI包装器。 (C ++ / cli项目中的链接器属性)。 以下是它现在的组织方式: – 原生C .lib:x86和64bit。 1解决方案包含2个项目: 与本机C .lib链接的C ++ / CLI包装器项目 C#项目引用C ++ / CLI项目 我的问题来自于我需要C#来定位“任何CPU”。 但是此选项在C ++ / CLI中不可用,因为它直接编译为本机代码。 我解决这个问题的想法是: – 在x86中编译C ++ / CLI包装器,然后更改配置并编译为64位。 当它编译时,我想告诉它基于平台采取哪个dll。 即:如果在64位编译,链接64位本机C dll,否则如果x86,链接x86本机C. – 完成后,我应该能够在我的C#平台中拥有任何CPU目标。 在这里,我将不再引用我的C ++ / CLI包装器项目,而是基于目标平台引用所需的dll。 我的问题是: 如何告诉C ++ / CLI项目基于目标平台链接到哪个.lib? 如何告诉C#项目基于目标平台引用哪个C […]

尝试使用interop将C ++转换为C#

我有一个用C ++调用EGL的程序。 我想在C#中进行相同的调用,但在C#中似乎没有相同的概念。 当执行上下文进入C ++ EGL代码时,我收到读/写访问被拒绝错误。 这是我试图转换为C#的C ++程序中的代码: PropertySet^ surfaceCreationProperties = ref new PropertySet(); surfaceCreationProperties->Insert(ref new String(EGLNativeWindowTypeProperty), somethingOtherThanAWindow); mEglSurface = eglCreateWindowSurface(mEglDisplay, config, reinterpret_cast(surfaceCreationProperties), surfaceAttributes)); 我有一个C#类,它将C#EGL调用转换为C ++调用。 我相信C ++是不受管理的,但我不知道如何告诉你。 C#类看起来像这样: public static IntPtr CreateWindowSurface(IntPtr dpy, IntPtr config, IntPtr win, int[] attrib_list) { IntPtr retValue; unsafe { fixed (int* p_attrib_list = attrib_list) { retValue = Delegates.peglCreateWindowSurface(dpy, config, […]

在为.Net编译C ++ / CLI时保留委托参数名称

在C#中,我可以使用Visual Studio来保留委托的参数名称。 例如,如果我有: public delegate void Blah(object myArg); public event Blah Foo; 然后,当我向事件添加方法时,Visual Studio UI会自动保留名称并创建方法: void Form1_Foo(object myArg); 但是,如果我在C ++ / CLI中声明一个委托: public: delegate void Blah(Object^ myArg); event Blah^ Foo; 它不保留名称并创建一个具有无意义名称的方法: void Form1_Foo(object A_0) 如何在C ++ / CLI中为参数设置有意义的名称? 编辑(添加ildasm结果): C ++ CLI事件: .method public hidebysig specialname instance void Invoke(object myArg) cil managed { } // […]

C#与C ++ / CLI中的Unicode字符串文字

C#: char z = ‘\u201D’; int i = (int)z; C++/CLI: wchar_t z = ‘\u201D’; int i = (int)z; 在C#中,“ i ”就像我预期的那样变成了8221($ 201D)。 另一方面,在C ++ / CLI中,它变为65428($ FF94)。 有些灵魂可以向我解释一下吗? 编辑 : wchar_t大小在这里不是问题,因为: C++/CLI: wchar_t z = (wchar_t)8221; int i = (int)z; 在这里, i变成8221,所以wchar_t确实取决于在我的系统上持有16位整数的游戏。 Ekeforshus

在C ++ / CLI中无法识别名称空间

我最近问过这个问题: 在c ++ / cli中创建命名空间? 所以我试图在c ++ / cli中创建自己的命名空间。 但是当我在两个单独的文件(.cpp)中使用相同的命名空间时,命名空间显然不会被识别为相同,因为当我尝试引用另一个文件中的另一个类时我遇到错误。 这基本上就是我所拥有的: Pets.cpp: namespace Animals { public ref class Pets { public: List ^vDogs; Pets::Pets() { vDogs = gcnew List(); } void Pets::DoSomething() { } }; } Dog.cpp: namespace Animals { public ref class Dog { Dog::Dog() { } void Dog::DoSomething() { } }; } 其他信息: […]

“using”关键字用于分配新的C ++ / CLI类

我有一个’C ++ / CLI’程序集,它实现了某些类。 我们假设该类是’SomeType’。 现在,在’C#’开发的应用程序中,执行以下操作 – while(!Console.KeyAvailable) { using(SomeType type = new SomeType()) { type.doSomething(); //do something } } 它会有任何后果,如内存泄漏等在任何情况下,如果有未处理的exception或任何此类情况? 我读到using关键字通常应该用于实现IDisposable的类,但对于C ++ / CLI类?

如何使用C ++ / CLI Wrapper将变量参数从托管传递到非托管?

要在托管域中实现params(可变参数)function,我们在c ++ / cli中执行以下操作,例如: funcManaged(int n, …array^ variableParams) 我对如何将其传递给接受可变参数的非托管域感到茫然。 funcUnmanaged(int n, …) 我试图传入数组,但结果很糟糕(访问冲突,垃圾数据等)。 //where unmanagedVariableParamsArray is an int array funcUnmanaged(int n, unmanagedVariableParamsArray); 资源建议创建一个va_list并传递它, vFuncUnmanaged(int n, va_list vl) 但是如何在c ++ / cli域中创建va_list以接受variableParams ? 重构遗留的非托管代码库并不是一个理想的解决方案。

如何在Windows窗体应用程序中显示MFC控件?

我想创建一个Windows窗体控件,它显示一个MFC控件,如CIPAddressCtrl ,带有一个工作的Text属性和TextChanged事件。 如何在Windows窗体应用程序中显示MFC控件? 如果有必要,我很高兴使用C ++ / CLI。 注意:我不是在问如何创建一个全新的Windows窗体控件; 我想在Windows窗体应用程序中托管旧版控件。

C ++ / CLI:优于C#的优势

托管C ++ / CLI与C#相比有什么主要优势吗? 绝对不是我想的语法,因为C ++ / CLI中的以下代码真的很难看, C ++ / CLI代码: [Out]List^% someVariable 比较上面的C#代码: out List someVariable 出于好奇,与上面相比,C ++ / CLI中的语法更加丑陋。