- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 LINQPad快速发展小ArcObjects (一个基于 COM 的库,用于 ESRI's ArcGIS 软件)应用程序,并在使用它来 Dump()
我从 .NET 初始化的 COM 对象的属性方面取得了一些成功,但任何 COM 对象都是从现有 COM 对象获取的对象被简单地转储为 System.__ComObject
引用,这不是特别有用:
This help topic解释了为什么会发生这种情况,我想我理解,但想知道有哪些选项可以解决此问题,尤其是在使 LINQPad(甚至)更强大的情况下。
有趣的是,Visual Studio 的调试器能够显示这些对象的属性,甚至是值类型的值:
Visual Studio 使用什么机制来实现这种自省(introspection),为什么 LINQPad 的 Dump 方法不这样做? 编辑: 请参阅有关 VS 如何执行此操作的相关问题:How does Visual Studio's debugger/interactive window dump the properties of COM Objects in .NET?
ArcObjects .NET SDK包括 PIA 和每个 CoClass 的 RCW,一个 COM 接口(interface)可能由其实现,所以我认为应该可以通过编程方式包装这些对象。
作为解决方法,我已成功使用 Marshal.CreateWrapperOfType()
在我碰巧知道应该使用哪个 CoClass 时,在我的 LINQ 查询中强制 LINQPad 转储对象的属性。当然,这只能正确转储值类型属性——任何基于 COM 的引用类型属性仍被报告为 System.__ComObject
,因此正确的解决方案必须递归地工作以将这些属性也包装起来。
在 previous question 中我了解到,如果 CoClass 实现了 IPersist
,则可以在运行时确定它。 ,这是 ArcObjects 的很大一部分。我能否以某种方式使用此技术或其他技术自动将 System.__ComObject
从 PIA 强制转换为适当的 RCW?如果是这样,我如何在 LINQPad 中实现它,例如通过提供 ICustomMemberProvider
执行?是否可以使它成为递归的,以便同时包装也是 COM 对象的属性?
我正在使用以 .NET 4.0 为目标的 LINQPad 4.x,但我也有兴趣支持 LINQPad 2.x(因此可以在 .NET 3.5 和 .NET 4.0 上运行的解决方案是首选,但这不是必需的) .
更新:我已经弄清楚了问题的第一部分,即如何使用 返回的 CLSID 在其 RCW 中包装
。看这个related question和 this answer对于我正在使用的代码。System.__ComObject
IPersist.GetClassID
我仍然想知道如何将其用于 LINQPad 的 Dump 方法。
最佳答案
我一直遇到一些相同的问题(除了我正在使用 iTunes COM 库)。
在 visual studio 中你没有意识到,但每个调试窗口在你打开它时都要求 COM 库创建类型。这与 Dump() 不同,后者是非交互式的。
我找到的唯一解决方案是,如果我知道列表是什么类型,就可以执行 OfType<>()
转换为该类型。这将遍历列表并强制 COM 创建元素。
所以在你上面的例子中你会说:
var layers = map.EnumerateLayers("etc")
.Select(s => s.OfType<Layer>())
.Dump();
注意 - 您的 millage 可能会有所不同,事实证明这是 OP 示例所必需的。
var layers = map.EnumerateLayers()
.OfType<IGeoFeatureLayer>()
.Dump();
根据 COM,您可能必须将其带到下一步并从那里拉出成员(对于 com,您必须询问以获得值)如下所示:
var layers = map.EnumerateLayers("etc")
.Select(x => x.OfType<Layer>())
.Select(x => new { x.Depth, x.Dimention, }) // etc
.Dump();
如果有一种“神奇”的方式来实现这一点当然会很好,但我不相信这是因为 COM 的性质。
关于c# - 如何获取 LINQPad 到 Dump() System.__ComObject 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716871/
我正在研究 MySQL 用户定义函数 (UDF),它基本上是 Windows 系统函数的包装器。我的问题是 UDF 对于某些输入按预期工作,但会导致 mysqld 对于其他输入崩溃。 UDF 本身采用
我在 this 中搜索过官方文档查找python中 json.dump() 和 json.dumps() 之间的区别。很明显,它们与文件写入选项有关。 但是它们之间的详细区别是什么?在什么情况下一个比
以前写的很简单,只有几句话,最近发现本文是本博客阅读量最大的一篇文章,觉得这样有种把人骗进来的感觉,于是又细化了一些。如果还有不好的地方,欢迎指出。 首先说明基本功能: dumps是将dict转
有没有办法在运行 'erl' 时禁用“崩溃转储”和“核心转储”文件的生成? PS:我知道 erl 的“+d”选项,但我想完全禁用崩溃/核心转储的生成。 最佳答案 您还可以将 ERL_CRASH_DUM
这是一个错误吗? >>> import json >>> import cPickle >>> json.dumps(cPickle.dumps(u'å')) Traceback (most rece
我已经开始了解用于对象序列化和反序列化的pickle模块了。 我知道pickle.dump是用来将代码存储为字节流(序列化),而pickle.load本质上是相反的,转成流字节返回到 python 对
我有一个这种格式的字符串, d = {'details': {'hawk_branch': {'tandem': ['4210bnd72']}, 'uclif_branch': {'tandem':
下面是我的python代码 r = requests.get("https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults
我正在使用 PigLatin,使用 grunt,每次我“转储”东西时,我的控制台都会被诸如此类、诸如此类的非信息所破坏,有没有办法抑制这一切? grunt> A = LOAD 'testingData
我正在尝试将 mongodump 编辑的一组 .bson 文件 mongorestore 到位于 docker 中的 mongo 数据库,在我只有 SSH 访问权限的 Ubuntu 实例上。 我有一个
我正在尝试使用语音发送文本 watson api,但是当我设置 interim_results = True 时,我收到了值错误。请帮助我:) with open(join(dirname(__fil
鉴于 dump.rdb(或 .json 格式)文件中现有 redis 数据库的快照,我想在我自己的机器上恢复此数据以在其上运行一些测试。 任何有关如何执行此操作的指示都将不胜感激。 我尝试解析 dum
我对 Laravel 4 和 Composer 还是很陌生。当我做 Laravel 4 教程时,我无法理解这两个命令之间的区别; php artisan dump-autoload 和 compose
之间有区别吗 object = {1:"one", 2:"two", 3:"three"} file.write(json.dumps(object)) 和 json.dump(object) .如果
导出/导入整个模式的旧方法: exp user/pwdp@server FILE=export.dmp OWNER=user ROWS=Y imp newuser/pwd@server FULL=
我有一堆需要恢复的 mongo 数据库。我使用 mongodump 获取备份目录,其中包括其中的集合。像这样: |- mydir |-- db1 |--- collection1 |--- colle
尽管我在 root 下运行 dotnet-dump,并且进程在 root 下运行(请参阅下面的服务描述),但似乎我缺乏一些权限。 我还尝试了 home、var 和 tmp 中的其他目录:所有相同的消息
我正在尝试生成 LLVM IR 代码,作为 Kaleidoscope tutorial 的一部分我已成功完成在同一台机器上,使用这些相同的编译器标志。 我的代码在 clang++ 3.4 中编译没有错
我正在使用 eclipse 开发 Web 应用程序,当我尝试从 eclipse 中在服务器上运行我的应用程序时遇到了问题。 # # A fatal error has been detected by
给定一个任意的 picklable Python 数据结构data,是 with open('a', 'bw') as f: f.write(pickle.dumps(data)) 相当于 w
我是一名优秀的程序员,十分优秀!