标签: managed

在托管包装器中包装非托管c ++

我有一个非托管的C++库.我想公开.NET应用程序的功能.有一个部分功能我不知道如何处理:

typedef void(free_fn*)(void*); void put(void*data,free_fn deallocation_function);

我们的想法是将动态分配的缓冲区传递给函数并提供释放函数.该库将异步处理数据,并在以后不再需要数据时释放缓冲区:

void*p = malloc(100); ...填写缓冲区... put(p,free);

我如何向.NET应用程序公开这种东西?

c++ memory allocation unmanaged managed

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

从托管C++ DLL使用C#程序集时崩溃

在Windows XP系统上,我正在编写一个Mangaged C++库,它在C#程序集中调用代码.不幸的是,只要我开始在C#程序集中引用一个符号,运行Managed C++库就会失败,并显示此错误(我从XP崩溃对话框中复制了此错误):

EventType : clr20r3
P1 : treeviewdemo.exe
P2 : 0.0.0.0
P3 : 4a5d6d62
P4 : system.windows.forms
P5 : 2.0.0.0
P6 : 4889dee7
P7 : 12fc     
P8 : ac
P9 : system.io.filenotfoundexception    
Run Code Online (Sandbox Code Playgroud)

Manged C++库基本上只是:

#using "C:\\MyCSharpAssembly.dll";

__declspec(dllexport) void callMangagedCode() {
  ManagedObject ^o = nullptr;
}
Run Code Online (Sandbox Code Playgroud)

'#using'本身似乎没有引起任何问题,但是一旦我从C#DLL开始使用符号,我就会遇到问题.有人知道发生了什么吗?

system.io.filenotfoundexception部分让我觉得有些DLL没有找到,但我不知道它在哪个或哪里.

c# c++ crash dll managed

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

在C#托管DirectX中制作自定义网格

我需要在运行时使用C#中的Managed DirectX 制作DirectX 3D网格.我无法找到有关如何执行此操作的任何信息.

  1. 不,我不能使用3D建模程序来制作我的对象.它们必须精确地确定尺寸和形状,并且在运行之前我没有任何尺寸或形状信息.
  2. 不,我无法从现有的DirectX网格功能构建模型.(一个简单的例子:DirectX的将让你轻松使用锥网和气缸网铅笔模型的过程中,你必须携带两个网格为你的铅笔,不只是一个,并正确定位和定向每个但你.甚至不能将铅笔的模型纵向分成两半,因为没有提供半圆柱或半锥形网格.)
  3. 在运行时,我已经计算了所有顶点并知道要连接哪些顶点以生成必要的三角形.
  4. 我需要的只是一种纯色.我不需要纹理贴图.

可以使用此DirectX调用获取球体
Mesh sphere = Mesh.Sphere(device, sphereRadius, sphereSlices, sphereStacks);
网格:此网格是在运行时构建的.

我需要知道的是如何制作类似的功能:
Mesh shape = MakeCustomMesh(device, vertexlist, trianglelist);
两个列表可以是任何合适的容器/格式.

如果有人能指出我管理的DirectX(C#)示例代码,即使它只是从3个硬编码三角形构建网格,这将是一个很大的好处.

c# directx runtime managed mesh

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

在C#中使用托管结构的大小

我试图将C++代码移植到C#.该代码用于注册窗口类RegisterClassEx.

C++代码有一个对象WNDCLASSEX wcex.对象wcex有一个属性

wcex.cbSize = sizeof(WNDCLASSEX);
Run Code Online (Sandbox Code Playgroud)

在C#中,我将结构定义为

    [StructLayout(LayoutKind.Sequential)]
    public struct WNDCLASSEX
    {
        public uint cbSize;
        public uint style;
        [MarshalAs(UnmanagedType.FunctionPtr)]
        public PlatformInvokeGDI32.WNDPROC lpfnWndProc;
        public int cbClsExtra;
        public int cbWndExtra;
        public IntPtr hInstance;
        public IntPtr hIcon;
        public IntPtr hCursor;
        public IntPtr hbrBackground;
        public string lpszMenuName;
        public string lpszClassName;
        public IntPtr hIconSm;
    }
Run Code Online (Sandbox Code Playgroud)

我试图使用大小

wcex.cbSize = (uint)sizeof(WNDCLASSEX);
Run Code Online (Sandbox Code Playgroud)

包含此stament的函数声明为

unsafe private void
Run Code Online (Sandbox Code Playgroud)

我希望unsafe这会使法规有效.但是,我在IDE中收到此错误:

Cannot take the address of, get the size of, or declare a pointer …

c# unmanaged managed sizeof

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

获取存储为对象的数组的第一个元素的地址

我需要获取任意类型数组的第一个元素的内存地址,该数组存储为Object类型。例如,数组可以是 double[] 或 int[],但在代码中它会被输入为 Object。

虽然获取已知类型数组的地址很简单,但在 C# 中不允许获取对象的地址。是否有一种类型(Object 除外)可以用来存储这样的数组,并且可以更轻松地获取其内存地址?或者有没有办法使用互操作/反射直接访问地址而无需中间数据副本?

请注意,在下面的第二行中,double[] 被存储为一个对象。请注意,在 fixed() 行中,我正在尝试获取 o 的地址,这在 C# 中是不允许的。

提前致谢!

int len=100;
object o = new double [len];

   unsafe
   {
                fixed(int*ptr=&o)
                for (int index = 0; index < len; index++)
                {
                  // access data directly to copy it, etc...
                }

    }
Run Code Online (Sandbox Code Playgroud)

.net c# reflection unsafe managed

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

错误C2143:缺少';' 之前' - >'

我在这里和互联网上搜索过,似乎没有人遇到类似的问题,我无法弄清楚为什么我不能让这个工作.

阻止我编译的那一行是:

LitCiterCommon::LitCiterTrace->Init();
Run Code Online (Sandbox Code Playgroud)

如果我LitCiterTrace.Init()从另一个文件(c#)调用它编译得很好,但由于某种原因我无法从托管cpp调用它.

任何想法或建议?

c# c++-cli managed

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

检测混合环境中的内存泄漏(Managed-Unmanaged)

我有一个用VC++ MFC 6.0编写的应用程序.最近通过在vs2008中编译升级到.NET 3.5,并通过使用托管和非托管环境向其添加了一些WPF应用程序.基本上在win32窗口上托管WPF.如果我只是打开一个WPF应用程序窗口,内存会持续上升到1KB/10秒.我尝试过使用.NET Memory Profiler和Ants内存分析器.但两者都无法帮我检测泄漏!我已从托管的WPF应用程序中删除了所有WPF控件.它只包含一个只有一个框架的页面.但仍然发生泄漏!! 有人请帮助我什么可能导致应用程序内存上升?

wpf memory-leaks unmanaged managed

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

如何在Visual C++ 2008 Managed中创建具有一个或多个函数的类模块

我是Visual C++的绝对新手,因此我不得不问你,如何在托管C++项目(Visual Studio 2008)中创建一个带有一个或多个函数的托管类模块(新类)?如果按下按钮,我将如何调用类的方法.我无法理解关于它的非常复杂的教程,大多数教程都涉及非托管代码或旧版Visual Studio.我自己的尝试完全失败并且只产生了错误,因为我没有找到关于如何向Visual C++托管项目添加新类文件的正确选项.如果我选择一个新的"CLR组件类",我会收到一条警告消息,告诉我填充屏幕右侧窗格的组件.如果我选择一个新的"CLR Windows Form Class",它什么都不会发生,没有添加扩展名为".class"的文件,或者我不知道新添加的文件.我只需要一个非常基本的类文件,其中包含一个公共函数,我可以从项目的任何位置调用它.

我有一个非常大的main()cpp文件(main.cpp),里面有很多函数.大约有几千个函数或更多函数,因此搜索或滚动变得困难.现在我想将这些1000个函数中的一些放在我当前项目中的第二个cpp文件中(在Visual Basic 6中,它简称为CSharp中的"新模块",它被称为"新类文件").问题是,一旦我将它们从main.cpp移到module1.cpp,我就无法在Visual C++中调用这个函数.

这就是我不想要的:

  • 一个DLL
  • 第二个项目
  • 添加对某事物的引用(在项目/参考文献中)
  • 双重声明

我知道有一种方法可以创建一个简单的类,然后创建一个这个类的新对象来使用它的方法.这就是我想要的.Google中关于此的示例对我不起作用,因为它们适用于Visual Studio的早期版本,与我的版本不兼容.从这个例子我知道我想要什么,但我没有在Visual Studio 2008中实现它的知识.

clr managed class function visual-c++

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

如何在 C++/CLI 中声明托管列表

使用 C++/CLI 我想声明一个列表的列表。
在声明常规列表时,我写道:

List<String^>^ NameOfList = gcnew List<String^>(2);

因此,我试图声明一个列表的列表,如:

List<List<String^>^>^ AnotherName = gcnew List<List<String^>(2)>(2);

但是,Microsoft Visual Studio 抱怨右手边的论点说它无效。

注意,我可以创建一个空列表

List<List<String^>^>^ AnotherName;

这工作正常。有人知道这里有什么问题吗?

c++-cli managed declaration list

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

在c ++中捕获并重新抛出异常

我是一个java开发人员,试图维护一些非常古老的c ++代码(仍然需要使用vs2010进行编译).

我在家里试图理解异常但没有测试内容的能力,很抱歉,如果这个问题很愚蠢.

你可以在低级函数中抛出一个异常,只是在顶部捕获它,还是必须在每个级别捕获并重新抛出它?

这是因为我正在编写本机代码,调用托管代码,调用c#,调用我的java rest资源这一事实.所以有没有任何级别我必须抓住并转换然后重新投掷.

先感谢您.

编辑:正如Jesper已经回答了上半部分,我的本机代码可以处理system :: exception吗?

c++ managed exception

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