首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过值将C#对象传递给COM

通过值将C#对象传递给COM
EN

Stack Overflow用户
提问于 2016-04-08 17:32:45
回答 1查看 292关注 0票数 7

我正在尝试使用来自C#的COM接口,它公开了由tlbimp生成的以下接口:

代码语言:javascript
运行
复制
[Guid("7DDCEDF4-3B78-460E-BB34-C7496FD3CD56")]
[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible | TypeLibTypeFlags.FDispatchable)]
public interface IFred 
{
    [DispId(1)]
    IBarney Pall { get; set; }
}

[Guid("E390230E-EE9C-4819-BC19-08DAB808AEA9")]
[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible | TypeLibTypeFlags.FDispatchable)]
public interface IBarney
{
    [DispId(1)]
    double Wilma { get; set; }
}

生成的包装程序集不包含IBarney接口的实现。我已经创建了一个实现IBarney接口的C#结构,如下所示:

代码语言:javascript
运行
复制
[Guid("2C61BA37-7047-43DB-84B1-83B4268CF77B")]
[ComVisible(true)]
public struct Barney : IBarney
{
    public double Wilma { get; set; }
}

现在的问题是,Barney实例是按值编组还是按引用编组?由于涉及到网络开销,这一点很重要。理想情况下,执行如下代码:

代码语言:javascript
运行
复制
fredInstance.Pall = new Barney { Wilma = 0.37 };

将导致单个网络往返。我如何验证这一点,或者我如何告诉COM interop我的Barney结构应该始终按值封送?

更新:

考虑到汉斯·帕桑特的评论。什么才是设计它的“合适”方式?需要什么IDL才能允许简单的结构用作COM接口的“属性”的值?查看我当前正在使用的从中生成接口的IDL,添加一个带有默认IBarney接口的coclass声明就足够了,对吧?

EN

回答 1

Stack Overflow用户

发布于 2016-04-08 23:05:16

一些评论..。不知道这是不是答案...

1)我认为你应该让你的接口成为ComVisible(真的)

2)为什么将Barney定义为struct?它应该是一个类。与C++不同的是,类和结构之间的唯一区别是私有成员和公共成员的默认值,而C#结构和类是根本不同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36496202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档