草庐IT

C++托管到非托管的转换

我已经完成了许多托管包装器,这些包装器处理包装非托管代码以便在托管中使用,但没有那么多是相反的。我正在运行的一个实验涉及使用托管代码来查找目录并将它们返回到stdvector中。长话短说,我在处理以下示例时发现了一个问题。#include"Helper.h"#include#includeusingnamespacemsclr::interop;usingnamespaceSystem;namespaceCLIWrapper{std::vectorHelper::GetDirs(constchar*root){std::vectorrval;String^path=gcnewSyste

c++ - 理解托管 C++

我无法理解托管C++的工作和编译方式。在.NETFramework中,您可以使用C#/VB/F#/..etc开发代码。所有这些语言都将被编译成与Java字节码类似的相同的通用中间语言(CIL)。理论上,CIL可以安装在任何平台上(Mono使其实用)。在Windows上,CLR将CIL即时编译为native代码(JIT),一切都顺利进行。现在,托管C++是如何编译的?它是否编译为CIL代码并等待CLR使用JIT运行它?我认为不是,因为托管C++可以使用标准C++代码(未编译为CIL)。此外,它如何使用.NET程序集(CIL)?如果有任何帮助,我将不胜感激。谢谢编辑:我看过这个answer

c# - Asp.net调用C#层调用Managed C++调用Native C++

我的项目结构如下:ASP.NET调用C#层调用ManagedC++调用NativeC++(我试图避免使用互操作,所以这就是托管C++层的原因)我编写了测试C#层的单元测试,它工作正常。当我尝试运行asp.net页面时出现:“无法加载文件或程序集...”错误。我发现当我将NativeC++dll复制粘贴到“TemporaryASP.NETFiles”(到相应的文件夹)时,该网站可以正常工作。似乎ManagedC++代码只有在位于同一文件夹中时才能找到NativeC++代码-显然我不能将我的Nativedll放在临时文件。有没有办法在全局位置设置Native(不适用于System32)?感

c# - 管理托管 (C#) 和非托管 (C++) 对象的析构函数

我在c#dll中有一个托管对象,它为c++dll中的非托管对象维护一个匿名整数句柄。在c++dll内部,匿名整数在std::map中用于检索非托管c++对象。通过这种机制,我可以使用匿名整数句柄维护托管对象和非托管对象之间的松散关联。在托管对象的终结方法(析构函数)中,我调用了非托管dll以删除非托管对象。C#程序运行时一切正常,但程序退出时出现问题。因为我无法控制托管端的删除操作顺序,非托管dll在任何托管对象之前从内存中删除。因此,当托管对象的析构函数被调用时(它又[至少间接地]调用非托管析构函数),非托管对象已经被删除并且程序崩溃。那么我怎样才能安全地删除与c#程序中的托管对象相

C# DLLImport for C++ dll

我有一个用C++/CLI和.NET构建的.dll。因此,它针对.NET应用程序。API是一组使用托管类型的包装器,因此它是NET原生的。我导入了.dll并添加了如下函数:[DllImport(@"maplib.dll")]publicstaticexternboolinitialize(stringa);当我在我的C#代码中调用这个函数时,它工作正常,但如果我想添加另一个函数,比如..[DllImport(@"maplib.dll")]publicstaticexternboolinitialize(stringa);publicstaticexternboolrunfile(stri

c++ - Boost 进程间分配器 - 管理文件大小

首先,我将概述带有源的域。namespacebip=boost::interprocess;typedefbip::allocatorallocator;typedefbip::vectorvector;bip::managed_mapped_filem_file(open_or_create,"./file",constant_value);bip::allocatoralloc(m_file.get_segment_manager());bip::vector*vec=m_file.find_or_construct("vector")(alloc);我不关心底层文件的最终大小,但

c# - 从非托管 C Dll 加载托管 C++ Dll?

我有一个现成的产品,它支持需要用非托管C编写的自定义插件。它不支持托管Dll,我的首选语言是c#。需要传回现成产品的信息非常基本,可以用字符串保存。所以我想我可以做以下事情:在C#Dll中编写我的大部分代码。用C++托管代码编写包装器,调用我的C#方法。用非托管C编写一个基本Dll,调用托管C++Dll。现在托管C++和C#Dll之间的通信很容易。但我不知道如何从非托管cdll调用托管c++函数。任何有关一些简单示例代码的帮助都会很棒。谢谢编辑:我创建了一篇代码项目文章,介绍了我如何使用下面的Alex的回答来做到这一点。http://www.codeproject.com/Tips/6

c# - 从 C# 调用非托管 .dll 的性能

使用以下语法从C#应用程序调用以C++编写的.dll会增加多长时间的典型开销?[DllImport("abc.dll",EntryPoint="xcFoo",CallingConvention=CallingConvention.Cdecl)]publicexternstaticResultFoo(outIntPtrsession,[MarshalAs(UnmanagedType.FunctionPtr)]ObjectCallbackcallback,UInt64turnKey,stringserverAddress,stringuserId,stringpassword);有没有更有

c# - "C# base class virtual function"- "override in Managed C++ ref class"

我有一个.NET_4ManagedC++ref类,它派生自用C#编写的.NET_4基类。C#基类:namespaceCore{publicclassResourceManager{publicclass_Resource{publicvirtualvoidDelete(){}}}}托管C++类:namespaceInput.DI{publicrefclassMouse:ResourceManager::_Resource{public:virtualvoidDelete(){}};}这是我遇到的错误:'Input::DI::Mouse::Delete':matchesbaserefcl

c++ - 关于如何将 F# 代码与 native C++ 集成的任何想法?

我想在nativeC++中使用一些F#代码。更准确地说,我想用F#编写一些数据结构,然后在我的C++代码中使用它们。我不知道如何将托管F#与非托管C++混合使用。如何创建粘合层? 最佳答案 一种方法是在C++/CLI中创建一个程序集,该程序集将是混合模式程序集,可以引用您的F#程序集并同时导出native符号,因此它们以后可以在nativec++库中使用。这个选项是最通用的。您可以使用此方法创建双向工作的“桥梁”。我在执行此操作时喜欢使用的一种方法(我这样做是为了在另一个nativec++/mfc应用程序中包含基于C#、Wpf的GU