views:

140

answers:

1
+1  A: 

Background

In C#, an interface is by definition empty and has many possible implementations. 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). In C#, the implementation of an interface is .NET specific. In COM, the implementation of an interface is a language-neutral, but a binary implementation (as opposed to SOAP messages, which is textual/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).

For practically all IDL commands, there's an equivalent possibility in C#, albeit not always within just in interface. The base interface of COM is always IUknown, which is used for object reference counting, which must be included by all COM objects.

In speech, when talking about a COM interface, you usually talk about an implementation. In c#, you usually talk about the empty contracts that callers and implementers understand.

Translate IDL

The IDL above is for DOM, as you mention. The DOM is implemented in C# and is much more powerful than its COM cousins (and many versions). If you really want to create a C# class wrapper that can call the COM DOM interfaces:

  • use MIDL (comes with Visual Studio) to create a TLB,
  • then run tlbimp.exe (comes with .NET) to create a .NET COM wrapper, which you can include in your project.

You can also run tlbimp.exe directly on the COM dlls (in process) or executables (out of process) to create a .NET COM Wrapper.

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.

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. Not a book you will read from cover to cover, but it makes excellent reference material.

Abel
I just don't like the way that the DOM is implemented into C#. That is, if you are referring to the `System.Web.UI` and `System.Web.UI.HtmlControls` namespaces.What I'm looking for is more like something that forces me to write HTML to W3C specification and won't even compile if I somehow screw it up. For example, if I try to add a certain type of attribute or content to an inappropriate element.Maybe I'll post a separate question for this one. Do you know of anything like this?
sfjedi
@sfjedi: the `System.Web` namespace is not what you want to refer to when using XML DOM. It has a different purpose: HTML, which is much more than just XML (and much less in other respects). What you should look for is the `System.Xml` namespaces with `XmlDocument` and, if you like LINQ (through `System.Linq.Xml`), the `XDocument`. Both are fully compatible with XML and DOM and are much further evoluted than MS's COM interfaces ever got.
Abel
Yes and I'm very familiar with `System.Linq.Xml` and `XDocument` and although they are quite impressive and useful, they still don't come anywhere close to what I'm trying to do, which is prevent the developer from compiling code that isn't to specification.
sfjedi