草庐IT

托管所

全部标签

c# - 在非托管 C++ 代码中使用 C# 属性

我们有一个主要用C#编写的大型项目(服务、多线程等)。然而,核心数字运算算法是用非托管C++编写的,以提高速度(OpenMP等)。不幸的是,目前我们必须付出很多努力才能在这两个世界之间交换数据。也就是说,我们必须在C++/CLI中为每个C++类编写包装类。对于(实际上)C#-“世界”中的任何所需设置(属性),在C++世界(头文件)中都有一个拷贝,并且在包装类中来回显式转换。这种架构看起来效率很低,而且很容易出错。主要问题:有没有办法在非托管C++中以某种方式自动共享具有属性的C#类?(我们必须读写!)次要问题:您能否就如何在上述情况下改进架构提出任何建议。我们的一个考虑是完全切换到C+

c++ - 如何在非托管 C++ 中捕获托管异常(来自委托(delegate))?

我使用非托管C++通过Marshal::GetFunctionPointerForDelegate提供的函数指针调用托管委托(delegate)。该委托(delegate)有可能引发异常。我需要能够在我的非托管C++中正确处理此异常,以确保诸如指针清理之类的事情,并可能将异常重新抛出到更多托管代码中。调用栈类似这样:托管代码->非托管C++->通过委托(delegate)回调托管代码(此处可以抛出异常)。任何人都有正确处理这种情况的指示,以便可以清理非托管代码中的资源并将可用的异常抛出到启动整个调用堆栈的托管代码? 最佳答案 从托管

c# - 如何从 C# 中的非托管内存中读取?

我想在C#中从在C++中创建的Foo结构的非托管数组创建Foo对象。这就是我认为它应该工作的方式:在C++方面:extern"C"__declspec(dllexport)void*createFooDetector(){returnnewFooDetector();}extern"C"__declspec(dllexport)voidreleaseFooDetector(void*fooDetector){FooDetector*fd=(FooDetector*)fooDetector;deletefd;}extern"C"__declspec(dllexport)intdetect

c# - 将指向类的指针从 C# 传递到非托管 C++ 代码

我在dll中有一个C++导出函数:intMyMethod(ulongpid,MyStruct*struct);MyStruct被描述为类:classMyStruct{public:ucharnVersion;ucharnModuleType;ucharnMachine64;ucharnReserved;ulongdata1;ulongdata2;ulongdata3;};我正在尝试将此函数导入到我的C#代码中,如下所示:[DllImport("mydll.dll",EntryPoint="#24")]privatestaticexternint_MyMethod(longpid,ref

c++ - 如何从非托管 C++ 调用托管 C++ 方法

请查看下面的更新(已解决)此外,我已将其扩展为第二个问题ImplementaC#DLLCOMFileInUnmanagedC++Program我已经研究了Internet的尽头,但没有找到一个真实的、可以理解的、人类的例子来说明如何做到这一点。我有一个加密和解密文本的C#DLL。我不想/没有智力在C++非托管代码中重写它。因此,我创建了一个与C#dll接口(interface)的C++/CLR类。现在我需要知道如何从非托管代码调用托管C++。这是我的托管代码,已验证它可以工作//clrTest.cpp:mainprojectfile.#include"cSharpRiJHarn"#in

c# - 通过 DllImport 调用非托管函数时堆损坏

我正在使用C#应用程序中用C/C++编写的非托管dll。我有兴趣使用dll中的以下函数:staticvoidStorePath(conststd::string&path,wchar_t*out_path,int*out_path_length){wcslcpy(out_path,c_str_w(path),*out_path_length);*out_path_length=path.size();}intWINAPIBrowseForDirectory(intallow_portable,intallow_online,wchar_t*t_directory,int*e_direc

.net - 如何在托管 CLR(不使用 C++/CLI)的 native C++ 应用程序中创建通用 .NET 类型?

在.NET程序中我可以createagenerictype通过:System::Type::MakeGenericType(...)必须有一种方法可以在nativeC++中为.NET类型执行此操作(使用_TypePtr)。我正在托管我自己的CLR实例,而不是使用C++/CLI。(Here'sanexampleofhowthatcanbedone。)我的方法是:_TypePtrBuildGenericType(_TypePtrspGenericType,_TypePtrspTypeArgs[]){returnspGenericType->.....???}但是没有MakeGenericT

c# - 调用采用指针引用的非托管库函数

假设我们有一个具有以下原型(prototype)的C++函数:intmyFunction(intsomeNumber,int&arraySize,signedchar*&array)//Extrafunctiontofreeallocatedmemory:intfreePointer(void*myPointer)此函数接受一些数字,并根据该数字创建一个数组。所以我们传递一个数字并得到一个数组。在C#中调用它的最佳方式是什么?我的第一种方法:[DllImport(...)]internalstaticintmyFunction(intsomeNumber,outintarraySize

c# - 如何从 C++ 调用托管 (C#) 函数?

我有一个C#DLL文件项目(my_cs_dll.dll),它定义了一个带有静态成员函数的静态类。namespaceFoo{publicstaticclassBar{publicstaticdoubleGetNumber(){return1.0;}}}我还有一个使用/clr的C++DLL项目。#usingdoubleget_number_from_cs(){returnFoo::Bar::GetNumber();}我在C++项目通用属性引用部分添加了对'my_cs_dll.dll'的引用(复制本地/复制依赖项均为True)。而且我还在C++项目配置属性C/C++常规“Resolve#us

c# - 使用非托管 C++ .dll 从 C# .exe 调用函数

所以,我有一个用C#制作的可执行文件,我没有它的源代码,但我用IDA反汇编了它,它给了我很多面向对象的汇编。我制作了一个.exe文件,将一个.dll注入(inject)到另一个.exe中,并且我将这个新的C++DLL注入(inject)到C#.exe中,没有任何问题,DLLMain被调用,所以...但是当我将这个DLL注入(inject)到一个用C++制作的普通.exe文件中时,我可以使用它的内存地址调用.exe中的一个函数,我可以在IDA上使用它。问题是,面向对象的程序集在其函数上没有地址,即使函数名称被反汇编也是如此。那么,有什么方法可以用我在C#.exe文件上注入(inject)