【发布时间】:2018-07-30 20:53:01
【问题描述】:
给定一个特定的类:
public class Klass
{
public int value;
public void doSomething(){
return;
}
}
据我所知,要使 COM 类可见,需要做几件事:
- 导入
System.Runtime.InteropServices - 为类创建一个接口。
- 扩展创建的界面。
- 创建 2 个唯一的 GUID,一个用于接口,另一个用于类。
- 向界面添加调度 ID。
生产类似的东西:
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface IKlass
{
[DispId(0)]
public int value;
[DispId(1)]
public void doSomething();
}
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None)]
public class Klass : IKlass
{
public int value;
public void doSomething(){
return;
}
}
在我看来,生成的代码看起来非常糟糕……问题是,有没有一种更简单的方法来创建这些 COM 接口?我可以想象自己修改构建过程以提供interop 功能。例如
public interop class Klass
{
public interop int value;
//...
}
但是,这是非标准的,它也存在问题。 Visual Studio / C# 中是否有任何内置功能可以让我更轻松/更清洁地构建 COM 接口?
【问题讨论】:
-
就我个人而言,使用公共成员变量,尤其是在涉及 COM 时,对我来说是非常错误的。
-
@UweKeim 嗯?怎么会?
ThisWorkbook.Sheets -
如果您认为这很难看,请尝试使用本机 C++ 编写 COM 服务器。您不知道为您处理了多少复杂性。
-
由于您反复说“界面”,因此可能没有更清洁的方法。否则,您不需要定义接口。
-
@ZoharPeled 呵呵...根据stackoverflow.com/questions/3699767/…,您可能是对的...“使程序集 COM 可见”是使程序集中的所有公共类型 [ComVisible] 的大锤。我需要试一试!