我有一个非托管的C++库.我想公开.NET应用程序的功能.有一个部分功能我不知道如何处理:
typedef void(free_fn*)(void*); void put(void*data,free_fn deallocation_function);
我们的想法是将动态分配的缓冲区传递给函数并提供释放函数.该库将异步处理数据,并在以后不再需要数据时释放缓冲区:
void*p = malloc(100); ...填写缓冲区... put(p,free);
我如何向.NET应用程序公开这种东西?
在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#中的Managed DirectX 制作DirectX 3D网格.我无法找到有关如何执行此操作的任何信息.
可以使用此DirectX调用获取球体
Mesh sphere = Mesh.Sphere(device, sphereRadius, sphereSlices, sphereStacks);
网格:此网格是在运行时构建的.
我需要知道的是如何制作类似的功能:
Mesh shape = MakeCustomMesh(device, vertexlist, trianglelist);
两个列表可以是任何合适的容器/格式.
如果有人能指出我管理的DirectX(C#)示例代码,即使它只是从3个硬编码三角形构建网格,这将是一个很大的好处.
我试图将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 …
我需要获取任意类型数组的第一个元素的内存地址,该数组存储为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) 我在这里和互联网上搜索过,似乎没有人遇到类似的问题,我无法弄清楚为什么我不能让这个工作.
阻止我编译的那一行是:
LitCiterCommon::LitCiterTrace->Init();
Run Code Online (Sandbox Code Playgroud)
如果我LitCiterTrace.Init()从另一个文件(c#)调用它编译得很好,但由于某种原因我无法从托管cpp调用它.
任何想法或建议?
我有一个用VC++ MFC 6.0编写的应用程序.最近通过在vs2008中编译升级到.NET 3.5,并通过使用托管和非托管环境向其添加了一些WPF应用程序.基本上在win32窗口上托管WPF.如果我只是打开一个WPF应用程序窗口,内存会持续上升到1KB/10秒.我尝试过使用.NET Memory Profiler和Ants内存分析器.但两者都无法帮我检测泄漏!我已从托管的WPF应用程序中删除了所有WPF控件.它只包含一个只有一个框架的页面.但仍然发生泄漏!! 有人请帮助我什么可能导致应用程序内存上升?
我是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++中调用这个函数.
这就是我不想要的:
我知道有一种方法可以创建一个简单的类,然后创建一个这个类的新对象来使用它的方法.这就是我想要的.Google中关于此的示例对我不起作用,因为它们适用于Visual Studio的早期版本,与我的版本不兼容.从这个例子我知道我想要什么,但我没有在Visual Studio 2008中实现它的知识.
使用 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;
这工作正常。有人知道这里有什么问题吗?
我是一个java开发人员,试图维护一些非常古老的c ++代码(仍然需要使用vs2010进行编译).
我在家里试图理解异常但没有测试内容的能力,很抱歉,如果这个问题很愚蠢.
你可以在低级函数中抛出一个异常,只是在顶部捕获它,还是必须在每个级别捕获并重新抛出它?
这是因为我正在编写本机代码,调用托管代码,调用c#,调用我的java rest资源这一事实.所以有没有任何级别我必须抓住并转换然后重新投掷.
先感谢您.
编辑:正如Jesper已经回答了上半部分,我的本机代码可以处理system :: exception吗?
managed ×10
c# ×5
c++ ×3
unmanaged ×3
c++-cli ×2
.net ×1
allocation ×1
class ×1
clr ×1
crash ×1
declaration ×1
directx ×1
dll ×1
exception ×1
function ×1
list ×1
memory ×1
memory-leaks ×1
mesh ×1
reflection ×1
runtime ×1
sizeof ×1
unsafe ×1
visual-c++ ×1
wpf ×1