【问题标题】:Passing Key-Value pair to a COM method from .NET将键值对从 .NET 传递给 COM 方法
【发布时间】:2010-04-09 22:08:43
【问题描述】:

我有以下问题: 我有一个使用第三方 COM 组件的 C# 项目。

所以问题是上面的组件有一个方法,它接受一个字符串和一些键值对作为参数。我已经设法通过 JavaScript 调用该方法:

 var srcName
 srcName = top.cadView.addSource( 'Database', { driver : 'Oracle', host : '10.10.1.123', port : 1234, database : 'someSID', user : 'someuser', password : 'somepass' } )
 if ( srcName != '' )
 {
  ...
 }

...而且效果很好。但是我不知道如何使用 C# 来做同样的事情。我尝试将这些对作为 Dictionary 和 Struct/Class 传递,但它给我一个“指定的演员表无效”。例外。我也尝试过像这样使用 Hashtable:

Hashtable args = new Hashtable();
args.Add("driver", "Oracle");
args.Add("host", "10.10.1.123");
args.Add("port", 1234);
args.Add("database", "someSID");
args.Add("user", "someUser");
args.Add("password", "samePass");

String srcName = axCVCanvas.addSource("Database", args);

虽然它没有抛出异常,但它仍然无法完成工作,将我写在日志文件中

[错误][14:38:33.281] Cad::SourceDB::SourceDB(): 缺失 参数“驱动程序”

【问题讨论】:

  • Mmmmm 从 javascript 访问数据库...
  • 你有描述 COM 接口的类型库吗?

标签: c# com


【解决方案1】:

你能传入一个分隔字符串列表吗?类似的东西

列表参数 = 新列表()

args.Add("key:value);

例如args.Add("驱动:Oracle);

【讨论】:

  • 我已经尝试过了,但不起作用 - 抛出 Specified cast is not valid." 异常
【解决方案2】:

ACtiveX 组件可能使用IDispatch 或IDispatchEx 方法将动态类型转换为属性名称列表,然后访问它们。

要么通过供应商或文档找到要传递的不同类型(这也可以),要么您需要自己实现其中一个接口(@98​​7654326@ 不需要)。

要尝试的另一件事是脚本 Dictionary 类型(您需要导入正确的类型库才能获得该类型)。

【讨论】:

  • Scripting.Dictionary 是一个非常好的主意,我从没想过,不幸的是没有成功。我会尝试使用 IDispatchEx 并让您知道我是否想到了什么。无论如何感谢您的帮助。
猜你喜欢
  • 2012-03-05
  • 2016-07-29
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多