On 10 December 2015 at 11:10, Arjang Assadi <arjang.ass...@gmail.com> wrote:

> Does Anyone know about any Autogeneration tool to Wrap Existing Classes
> and Generate COM exposed objects? I am doing it by hand, it tedious and
> error prone, looks like an ideal use case for Roslyn or Resharper.
>

.NET can generate COM proxies all on its own: just regasm any assembly with
anything "ComVisible(true)" in it, even without any other COM attributes.
However, the result is quite ugly and generally only consumable from C++.
VB6 only understands a subset of COM, and VBScript an even smaller subset.
Also, I believe clsids are basically randomized in this mode so you may
encounter dependency hells and dreaded diamonds when building/deploying new
releases. As I'm sure you have discovered, long-term maintenance requires
proper COM attributes.

One way (that I have never tried) is to write COM interface files [1] and
compile them into a typelib file with midl.exe [2]. Once you have the
typelib, you can generate C# proxies using tlbimp.exe [3]. You can use this
generated model directly or you can write some mapping functions between
this generated model and your existing "nice" model.

I personally found that hand-crafted proxies were still the simplest way to
export classes that were VB6-friendly, and idiomatic VB. This was important
to us because our VB6 programmer is not a .NET programmer. Also, all the
"quirks" could be isolated in these proxies and documented there. No
cross-contamination: the C# side was idiomatic C# and the VB side was
idiomatic VB.

Code generation also has other issues in .NET, but my views on this are
known to the list and you can generally assume an anti-codegen stance from
me. Poor build-system integration -> no hermetic builds -> randomly broken
builds -> "works for me" bugs.

[1] https://msdn.microsoft.com/en-us/library/windows/desktop/aa378712.aspx
[2] https://msdn.microsoft.com/en-us/library/windows/desktop/aa367084.aspx
[3] https://msdn.microsoft.com/en-us/library/tt0cf3sx.aspx

--
Thomas Koster

Reply via email to