从托管C++,我调用一个非托管C++方法,它返回一个double.如何将此双精度转换为托管字符串?
有时很难描述"我们的程序员"可能认为对非程序员和管理类型来说很简单的一些事情.
所以...
您如何描述托管代码(或Java字节代码)与非托管/本机代码之间的区别?
我正在创建一个CLI项目来包装现有的本机c ++项目(同一个解决方案文件中的两个独立项目).我想在托管类中包含一个指向本机类的指针作为成员.从我在线阅读的文档中,如果托管代码和非托管代码在同一个项目中,则可以完成此操作.如果本机代码和托管代码位于不同的项目中,那么唯一的选择是在两个项目之间使用dllimport和dllexport属性,并将本机代码类函数导出为静态函数.
这些是我唯一的选择,还是可以在两个单独的项目之间导入和导出整个本机类?我问,因为这决定了我如何设计我的托管包装器.提前致谢.
我的主要启动项目是c ++.该解决方案还涉及托管的c#代码.当我调试时 - 我只在非托管部分上有断点(在托管断点上它指出:"断点当前不会被命中.无效的文件行"
我检查了引用,发现那里有dll和pdb.
会是什么呢?
把所有美学考虑放在一边......哪种替代方案更受欢迎?我主要关注的是构建时间,保持代码可读性和易于保持,当然,它编译.
我已经看到大多数书籍都在.cpp文件中定义了所有内容,一个la C#,但是......这会不会加剧构建时间?好吧,很可能是非托管C++基本原理不适用于托管C++/CLI,但是请考虑一个转换场景:非托管C++的项目类被移动到C++/CLI项目中,整个怪物构建正常,并且坐着在那里等待一个勇敢的家伙(我,咳咳)将非托管类转换为托管类,当然,逐步并使用后备测试工具.
我有点离题了,但我想让你在回答时考虑我的异常情况(托管和非托管交互).
我有一个在c++ Win32 DLL 中定义的结构,如下所示:
typedef struct matrix
{
double** data;
int m;
int n;
} Matrix;
Run Code Online (Sandbox Code Playgroud)
还有一个功能:
Matrix getMatrix(void);
Matrix getMatrix()
{
Matrix mat;
mat.m = 2;
mat.n = 2;
mat.data = (double**) malloc (sizeof(double*) * 4);
mat.data[0] = (double* ) malloc (sizeof(double) * 2);
mat.data[1] = (double* ) malloc (sizeof(double) * 2);
mat.data [0][0]=1;
mat.data [0][1]=2;
mat.data [1][0]=3;
mat.data [1][1]=4;
return mat;
}
Run Code Online (Sandbox Code Playgroud)
如果我P/Invoke从 C# 应用程序使用,如何捕获此函数的返回值
我试图从非托管C++代码调用.NET 4.0 DLL.
我按照Atul Mani的Code Project文章中的说明进行操作.
我构建了.NET dll,并遵循所有步骤,包括使用regasm注册它.
接下来,我创建了一个非托管C++项目,并在.cpp文件的开头添加了这一行:
#import "D:\PathToMyCSharpProject\bin\Debug\com.DeviceServices.tlb" rename ("EOF","adoEOF") no_namespace named_guids raw_interfaces_only
Run Code Online (Sandbox Code Playgroud)
当我构建C++项目时,在D:\ MyCPlusPlusProject\Debug中创建了一个.tlh文件.
接下来,我添加了CodeProject文章建议的代码,该文章尝试从C#库创建指向对象的指针.
CoInitialize(NULL); //Initialize all COM Components
// <namespace>::<InterfaceName>
MyCSharpNamespace::IMyCSharpInterfacePtr pMyCSharpInterfacePtr;
Run Code Online (Sandbox Code Playgroud)
"MyCSharpNamespace"是我在C#项目中使用的命名空间.
当我构建C++项目时,我现在得到一个编译错误:
错误2错误C2653:'MyCSharpNamespace':不是类或命名空间名称
还有其他错误,因为它无法识别IMyCSharpInterfactPtr.
所以,我查看了.tlh文件,内容如下:
// Created by Microsoft (R) C/C++ Compiler Version 10.00.40219.01 (6478e0c7).
//
// MyCPlusPlusProjectPath\debug\com.deviceservices.tlh
//
// C++ source equivalent of Win32 type library MyCSharpProjectPath\bin\Debug\com.DeviceServices.tlb
// compiler-generated file created 05/27/14 at 11:52:16 - DO NOT EDIT!
#pragma once
#pragma pack(push, 8)
#include <comdef.h>
//
// Forward …Run Code Online (Sandbox Code Playgroud) 我按照MSDN上的EWS托管API示例在我的Exchange邮箱帐户中查找所有未读电子邮件.
我后来浏览了每个找到的项目,以便将它们放入我需要返回的列表中,同时获取每条消息的正文IsRead=true并按如下方式更新每个消息:
Folder.Bind(Service, WellKnownFolderName.Inbox);
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And,
new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
//ItemView limits the results to numOfMails2Fetch items
FindItemsResults<Item> foundItems = Service.FindItems(WellKnownFolderName.Inbox, sf,
new ItemView(numOfMails2Fetch));
if (foundItems.TotalCount > 0)
{
List<EmailMessage> emailsList = new List<EmailMessage>(foundItems.TotalCount);
foundItems.Items.ToList().ForEach(item =>
{
var iEM = item as EmailMessage;
emailsList.Add(iEM);
// update properties
iEM.IsRead = true;
iEM.Update(ConflictResolutionMode.AutoResolve);
});
// fetches and assign the bodies of each email
Service.LoadPropertiesForItems(emailsList,PropertySet.FirstClassProperties);
return emailsList;
} else return null;
Run Code Online (Sandbox Code Playgroud)
是否可以IsRead=true在一个请求中更新所有找到的项目?即不逐一更新它们=更好的性能和连贯的逻辑.
在本教程之后,构建 ODP.NET 托管驱动程序应用程序简介
在主题“使用 TNS_ADMIN 属性进行连接”中,当我运行时,出现“无法识别的配置部分 oracle.manageddataaccess.client”错误。
我需要对部署在 Kubernetes 集群 (EKS) 上的应用程序实施速率限制(基于 URL 和路径)。
我正在寻找一种涉及最少脚本的托管方式,并且确实提供了一个界面,通过该界面来管理不同应用程序的速率限制。
该系统应该能够在企业级别准确工作。
有人可以建议我遵循的路径/工具/框架来实现它。
managed ×10
unmanaged ×5
c++ ×4
c# ×3
c++-cli ×2
amazon-eks ×1
bytecode ×1
com ×1
debugging ×1
double ×1
email ×1
interop ×1
kubernetes ×1
marshalling ×1
mixed-mode ×1
odp.net ×1
oracle ×1
pinvoke ×1
visual-c++ ×1
wrapper ×1