简体   繁体   English

你如何将IDL翻译成C#?

[英]How do you translate IDL into C#?

For example, the DOM specification has various IDL definitions , one of which is the Interface Node . 例如, DOM规范具有各种IDL定义 ,其中一个是接口节点 How would you go about translating this—even a portion of this—into actual C#? 您如何将这个 - 甚至是其中的一部分 - 转换为实际的C#? I mean, where would you even start? 我的意思是,你甚至会在哪里开始? As far as I understand, C#'s interfaces behave much differently than what IDL is calling an interface here. 据我所知,C#的接口行为与IDL在此处调用接口的行为大相径庭。 Am I wrong? 我错了吗?

interface Node {

  // NodeType
  const unsigned short      ELEMENT_NODE                   = 1;
  const unsigned short      ATTRIBUTE_NODE                 = 2;
  const unsigned short      TEXT_NODE                      = 3;
  const unsigned short      CDATA_SECTION_NODE             = 4;
  const unsigned short      ENTITY_REFERENCE_NODE          = 5;
  const unsigned short      ENTITY_NODE                    = 6;
  const unsigned short      PROCESSING_INSTRUCTION_NODE    = 7;
  const unsigned short      COMMENT_NODE                   = 8;
  const unsigned short      DOCUMENT_NODE                  = 9;
  const unsigned short      DOCUMENT_TYPE_NODE             = 10;
  const unsigned short      DOCUMENT_FRAGMENT_NODE         = 11;
  const unsigned short      NOTATION_NODE                  = 12;

  readonly attribute DOMString       nodeName;
           attribute DOMString       nodeValue;
                                        // raises(DOMException) on setting
                                        // raises(DOMException) on retrieval

  readonly attribute unsigned short  nodeType;
  readonly attribute Node            parentNode;
  readonly attribute NodeList        childNodes;
  readonly attribute Node            firstChild;
  readonly attribute Node            lastChild;
  readonly attribute Node            previousSibling;
  readonly attribute Node            nextSibling;
  readonly attribute NamedNodeMap    attributes;
  // Modified in DOM Level 2:
  readonly attribute Document        ownerDocument;
  // Modified in DOM Level 3:
  Node               insertBefore(in Node newChild, 
                                  in Node refChild)
                                        raises(DOMException);
  // Modified in DOM Level 3:
  Node               replaceChild(in Node newChild, 
                                  in Node oldChild)
                                        raises(DOMException);
  // Modified in DOM Level 3:
  Node               removeChild(in Node oldChild)
                                        raises(DOMException);
  // Modified in DOM Level 3:
  Node               appendChild(in Node newChild)
                                        raises(DOMException);
  boolean            hasChildNodes();
  Node               cloneNode(in boolean deep);
  // Modified in DOM Level 3:
  void               normalize();
  // Introduced in DOM Level 2:
  boolean            isSupported(in DOMString feature, 
                                 in DOMString version);
  // Introduced in DOM Level 2:
  readonly attribute DOMString       namespaceURI;
  // Introduced in DOM Level 2:
           attribute DOMString       prefix;
                                        // raises(DOMException) on setting

  // Introduced in DOM Level 2:
  readonly attribute DOMString       localName;
  // Introduced in DOM Level 2:
  boolean            hasAttributes();
  // Introduced in DOM Level 3:
  readonly attribute DOMString       baseURI;

  // DocumentPosition
  const unsigned short      DOCUMENT_POSITION_DISCONNECTED = 0x01;
  const unsigned short      DOCUMENT_POSITION_PRECEDING    = 0x02;
  const unsigned short      DOCUMENT_POSITION_FOLLOWING    = 0x04;
  const unsigned short      DOCUMENT_POSITION_CONTAINS     = 0x08;
  const unsigned short      DOCUMENT_POSITION_CONTAINED_BY = 0x10;
  const unsigned short      DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;

  // Introduced in DOM Level 3:
  unsigned short     compareDocumentPosition(in Node other)
                                        raises(DOMException);
  // Introduced in DOM Level 3:
           attribute DOMString       textContent;
                                        // raises(DOMException) on setting
                                        // raises(DOMException) on retrieval

  // Introduced in DOM Level 3:
  boolean            isSameNode(in Node other);
  // Introduced in DOM Level 3:
  DOMString          lookupPrefix(in DOMString namespaceURI);
  // Introduced in DOM Level 3:
  boolean            isDefaultNamespace(in DOMString namespaceURI);
  // Introduced in DOM Level 3:
  DOMString          lookupNamespaceURI(in DOMString prefix);
  // Introduced in DOM Level 3:
  boolean            isEqualNode(in Node arg);
  // Introduced in DOM Level 3:
  DOMObject          getFeature(in DOMString feature, 
                                in DOMString version);
  // Introduced in DOM Level 3:
  DOMUserData        setUserData(in DOMString key, 
                                 in DOMUserData data, 
                                 in UserDataHandler handler);
  // Introduced in DOM Level 3:
  DOMUserData        getUserData(in DOMString key);
};

Background 背景

In C#, an interface is by definition empty and has many possible implementations. 在C#中,接口根据定义为空,并且具有许多可能的实现。 In COM, in general, an interface will have one implementation and defines a calling contract, not an implementation contract (like with web services or CORBA). 在COM中,通常,接口将具有一个实现并定义调用契约,而不是实现契约(如Web服务或CORBA)。 In C#, the implementation of an interface is .NET specific. 在C#中,接口的实现是特定于.NET的。 In COM, the implementation of an interface is a language-neutral, but a binary implementation (as opposed to SOAP messages, which is textual/XML). 在COM中,接口的实现是语言中立的,但是是二进制实现(与SOAP消息相反,它是文本/ XML)。 This binary definition has always been food for criticasters of COM and the slow (if at all) adoption of COM on non-Windows systems (again, as opposed to web services). 这个二进制定义一直是COM的批评者和非Windows系统上COM的缓慢(如果有的话)采用(同样,与Web服务相对)的食物。

For practically all IDL commands, there's an equivalent possibility in C#, albeit not always within just in interface. 对于几乎所有的IDL命令,C#中都有同等的可能性,尽管并不总是在接口中。 The base interface of COM is always IUknown , which is used for object reference counting, which must be included by all COM objects. COM的基本接口始终为IUknown ,用于对象引用计数,必须包含在所有COM对象中。

In speech, when talking about a COM interface, you usually talk about an implementation. 在演讲中,当谈到COM接口时,您通常会谈论一个实现。 In c#, you usually talk about the empty contracts that callers and implementers understand. 在c#中,您通常会谈到调用者和实现者理解的空契约。

Translate IDL 翻译IDL

The IDL above is for DOM, as you mention. 正如你所提到的,上面的IDL适用于DOM。 The DOM is implemented in C# and is much more powerful than its COM cousins (and many versions). DOM在C#中实现,并且比它的COM堂兄弟(以及许多版本)强大得多。 If you really want to create a C# class wrapper that can call the COM DOM interfaces: 如果你真的想创建一个可以调用COM DOM接口的C#类包装器:

  • use MIDL (comes with Visual Studio) to create a TLB, 使用MIDL(自带Visual Studio)创建TLB,
  • then run tlbimp.exe (comes with .NET) to create a .NET COM wrapper, which you can include in your project. 然后运行tlbimp.exe(随.NET一起提供)来创建.NET COM包装器,您可以将其包含在项目中。

You can also run tlbimp.exe directly on the COM dlls (in process) or executables (out of process) to create a .NET COM Wrapper. 您还可以直接在COM dll(进程中)或可执行文件(进程外)上运行tlbimp.exe以创建.NET COM包装器。

More information 更多信息

A basic, yet extremely brilliant and thorough introduction to COM is Don Box's famous book Essential COM , about IDL I suggest Essential IDL by Gudgin . COM的一个基本的,但非常精彩和彻底的介绍是Don Box的着名书籍Essential COM ,关于IDL我建议Gudgin的Essential IDL

Absolutely everything there is to know about COM and .NET is written down in the comprehensive, yet slightly bloated, .NET and .COM The Complete Interoperability Guide by Nathan. 绝对有关COM和.NET的所有知识都写在全面但略显臃肿的.NET和.COM完整的互操作性指南中 Not a book you will read from cover to cover, but it makes excellent reference material. 不是一本书,你将从封面到封面阅读,但它是很好的参考资料。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM