Tag: c ++ cli

使用纯虚方法包装类

我有一个非托管的DLL,它包含一个只有纯虚方法的类(回调类型): class PAClient { public: __declspec(dllexport) virtual void SetCalculationStarted() = 0; __declspec(dllexport) virtual void SetCalculationStopped() = 0; } 现在我必须将这些函数调用发送到托管C#代码并决定使用接口。 这就是我所做的: public interface class IPAClientWrapper { void SetCalculationStarted(); void SetCalculationStopped(); }; private class PAClientWrapper : public PAClient { private: gcroot callBack; public: PAClientWrapper(IPAClientWrapper^ c) { callBack = c; } void SetCalculationStarted() { callBack->SetCalculationStarted(); } void SetCalculationStopped() […]

从C ++托管的dll抛出的C#exception – EEFileLoadException * __ptr64

我从正常的C#控制台程序中得到此错误,该程序正在使用作为C ++ CLI项目的构建输出生成的DLL。 我有一个简单的DumbThing public ref class与静态方法。 我想简单地调用该函数或至少实例化一个微小的DumbThing对象,并看到C#可以调用它从C ++ CLI生成的DLL中获取的代码,但是它没有工作,因为它抛出的错误让我更加困惑: First-chance exception at 0x000007fefd2acacd (KernelBase.dll) in DumbTest.exe: Microsoft C++ exception: EEFileLoadException * __ptr64 at memory location 0x007fc228.. 更新:在原始exception之下,还有另一个第一次机会exception: First-chance exception at 0x77cace3b (ntdll.dll) in DumbTest.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff. 一位同事向我指出,这可能是一个编译时问题(一些选项),但我没有任何可能导致它的线索。 有谁可以提供一些起点提示?

我们如何使用共享内存段与两个托管进程之间的“对象”共享数据?

如何使用共享内存段在两个托管进程之间共享数据? 我在C ++ / CLI代码中使用”object”来与其他进程中的其他内存部分共享数据。 我正在使用以下代码段。 #define BUFFER_SIZE 32768 #pragma data_seg (“.SHAREDMEMORY”) bool _Locked = false; bool _Initialized = false; unsigned char[10000] data = NULL; #pragma data_seg() #pragma comment(linker,”/SECTION:.SHAREDMEMORY,RWS”) 但我需要它: #pragma data_seg (“.SHAREDMEMORY”) bool _Locked = false; bool _Initialized = false; object^ _object = nullptr; #pragma data_seg() #pragma comment(linker,”/SECTION:.SHAREDMEMORY,RWS”) 它说”global or static variable may not […]

用于DOTNET的包装器用C ++ CLI编写的本机BestWay通过strutures?

然而,我正在为C ++ CLI编写一个包装器,为我们的应用程序提供一些新的部件(用C#编写),可以保存并轻松访问旧的本机库。 因此我需要将一些结构从c#传递给c ++。 这些结构在C ++ Cli(dotnet)和C ++中定义。 例: \\C+++ typedef struct { INFO16 jahr ; INFO8 monat ; INFO8 tag ; INFO8 stunde ; INFO8 minute ; } SDATUM; \\c++ cli [StructLayout(LayoutKind::Explicit)] public value struct SDATUM { public: [FieldOffset(0)] UInt16 jahr; [FieldOffset(2)] Byte monat; [FieldOffset(3)] Byte tag; [FieldOffset(4)] Byte stunde; [FieldOffset(5)] Byte minute; […]

在.net4中未调用托管C ++静态构造函数

我最近将一个项目从.NET 3.5移到了.NET 4.我使用的是C#,托管C ++和非托管C ++。 在我的一个托管C ++(互操作)中,我有一个静态构造函数: public ref class StaticPool : public BaseStaticPools { public: static StaticPool() { InitializePools(); } static Poolable^ Dequeue() { return (Poolable^)Dequeue(Poolable::typeid); } private: static void InitializePools() { BaseStaticPools::CreatePool(Poolable::typeid); } }; 在.NET 3.5中,第一次调用Dequeue()时会触发静态初始化,后者运行静态构造函数。 一旦我转移到.NET 4.0,从未调用静态构造函数。 我知道.NET 4.0中的静态初始化已经发生了变化,但根据我读到的所有内容,它应该可以正常工作。

如何从C ++ COM迁移到C ++ CLI

我有一个C ++ DLL,通过COM公开东西。 我想将其转换为公开托管接口的C ++ / CLI。 理想情况下,我只需添加CLI并逐个转换接口。 到目前为止,我还没有成功,所以我正在寻找一个具体的策略。 更多细节:很久以前,我使用COM创建了一个应用程序,用于在C#和C ++之间来回通信。 我厌倦了COM,并且在C ++方面需要注册和箍跳。 我想使用C ++ / CLI,并将整个工作作为托管代码,偶尔从C ++ / CLI调用我正在使用的本机库。 任何人都可以提出一个温和的迁移路径,这样我就可以同时使用CLI和COM,并且在我去的时候通过类测试转换类。 或类似的东西。 需要说明的是:我目前拥有定义和实现COM接口的本机C ++代码。 我有C#代码使用COM属性来导出类。 所有这些东西都被注册为COM互操作,并且有两个方向的呼叫。 我希望将C ++切换到CLI并切换到C ++中的托管类而不是COM类。 Ramhound更新了问题:无论如何,我遇到了砖墙。 在C ++ dll上打开/ clr会给我尝试连接到该C ++代码的其他东西带来链接错误。 (那种让我远离C ++的不可读的ATL / COM消息)

使用StructureToPtr将C#结构编组到C ++

我有C#类: namespace Models { [StructLayout(LayoutKind.Explicit, Size = 120, CharSet = CharSet.Unicode)] public struct DynamicState { [FieldOffset(0)] public double[] Position; [FieldOffset(24)] public double[] Velocity; [FieldOffset(48)] public double[] Acceleration; [FieldOffset(72)] public double[] Attitude; [FieldOffset(96)] public double[] AngularVelocity; } } 和C ++ / CLI方法: Models::DynamicState SomeClassClr::DoSomething(Models::DynamicState ds) { int struct_size = Marshal::SizeOf(ds); System::IntPtr ptr = Marshal::AllocHGlobal(struct_size); DynamicStateStruct ds_struct; […]

用于在Windows上创建快速,现代和响应式GUI的C ++ / CLI或C#

目前我分为这两种语言。 我几乎已经编程了当前应用程序的一半,这需要非常快。 它可以在多种负载条件下计算任何类型的绝缘玻璃结构。 我只是不知道它是否是用C ++ / CLI编写它的正确选择。 例如,在互联网上,我甚至从未读过“C ++ / CLI”的名称,但每个人都建议学习C#。 C ++ / CLI的真正缺点是什么? 我从阅读中得知,未来几年它注定会被弃用。 这是真的? 如果有一些,它们是如此糟糕,真的有必要切换到C#? 目前针对C#的唯一一件事就是我有C代码需要访问,而且由于安全问题和黑客攻击,我无法创建.Dll。 (该计划将非常昂贵) 为了编写在Windows上运行的快速GUI(还有3D动画和多核甚至图形核心处理),我还有什么其他机会?

如何在C ++ / CLI中将C ++ short *传递给托管C#程序集

我在将C ++ / CLI代码中的参数传递给.NET C#函数时遇到了麻烦。 在C ++中,我有类似以下内容: void SomeFunction(short *id) { CSharpClass::StaticClassInstance->SetValue(id); } 在C#端,该函数使用ref参数声明为: public void SetValue(ref short id) { id = this.internalIdField; } 我在调用SetValue(id)时得到的编译错误是“无法将参数1从’short *’转换为’short%’”。 我发现跟踪引用(%)等同于C#ref,但我不知道如何将它与我试图传递的short *参数一起使用。 提前致谢。

将C ++ / CLI转换为C#

我有一个C ++ / CLI中的小型到中型项目。 我真的很讨厌C ++ / CLI的语法扩展,我更喜欢在C#中工作。 是否有一种工具可以很好地将一种工具转换为另一种工具? 编辑:当我说托管c ++之前,我显然是指c ++ / CLI