COM visible DLLs: are they only legends?

Can anybody provide a direct, straightforward method of creating a DLL with properties and methods exposed to other programs? I followed the instructions that I found on the MSDN websites as well as suggestions from forum participants. The DLL should be available both for COM and .NET programs. So far, nothing has worked.

There are numerous variations listed on the MSDN site. No doubt there are reasons for the differing instructions. However, I have not had sufficient success with any of them. Sometimes, just building the project makes the class visible to COM compatible programs. Other times, only after running regasm. Still other times, I have to run regasm, sn and gacutil before the DLLs class gets exposed. Then forums posters tell me: "you shouldn't have to do all that." I agree I shouldn't have to but even that is not sufficient. Even all that does not help because only the class and an enum are visible; the public properties, functions and subs are not available when I try to access the DLL. I've seen similar posts with a similar problems, but I've never seen an effective answer to the problem.

Example of previous similar problem without resolution:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=54426&SiteID=1

On the MS Press site I found a pdf file for a book called: Upgrading Microsoft Visual Baisc 6.0 to Microsoft Visual Basic.NET. The instructions it included worked fine in VB2003 as far as getting other programs to recognize the class in the DLL. Unfortunately, again the properties and methods were not available for use (in all cases, the best I could get was recognition of an Enum).

I've even found walkthroughs (usually quite helpful but in this case useless) which do give the result describe in the instructions. Is there anybody who knows the exact steps one must take to create a COM visible .NET dll?

[2010 byte] By [rwbogosian] at [2007-12-17]
# 1
>Even all that does not help because only the class and an enum are visible; the public properties, functions and subs are not available when I try to access the DLL.

See if this explains it

http://www.dotnetinterop.com/faq/?q=ClassInterface

MattiasSj?gren at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 2
I am not a fan of the VS.NET help system so any outside source of information is greatly appreciated. I did check out the faq. As I mentioned, I have examined dozens of pages of info about com - none of which actually describes a straightforward method. It's amazing how many times I have read: you can do this, that and the other thing but we don't recommend it.

While the link noted appears to be a very good source of information and actually helped to clarify a few things for me, it still doesn't resolve my problem.

I did "...explicitly define an interface..." several days ago; that didn't help. Naturally the last option was the recommended one "...The last and recommended option is ClassInterfaceType.None..." is preferred but didn't work either. Not even the class no less its methods were visible. Also, can't use ClassInterfaceType and ComClass at the same time but: "...if you're using VB.NET and the ComClass attribute, it uses ClassInterfaceType.None behind the scenes and defines a nested explicit interface for you (to me, it appears to be implying that ClassInterfaceType is not needed if an interface is defined). However, the ComClass attribute also has versioning issues, so it's not recommended to use this as a shortcut." Oh well, not recommended and does not do the job anyway.

I've never found DLLs complicated to write in C++ or even VB until .NET came along. I know it is supposed to provide benefits in the loooooong run. I just hope it is worth all the time wasted trying to find answers to what used to be simple procedures. Now, I know where the term DLL Hell came from - .NET DLL. In the .NET help world everything is a piece of this maybe, a piece of that maybe, or maybe a piece of this other thing (or not), find some glue somewhere (if you can) and hope it works.

If the COM visible DLL is not a legend then I challenge all forum participants to provide one simple, clear-cut, straightforward, step by step explanation of how to create a COM visible .NET DLL. I'm not talking anything exotic - just a simple DLL with fields, properties, functions and subs that can be used by COM and .NET programs (as advertised but never explained).

rwbogosian at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 3
This is for vb 2005

Create a vb class library.
Select add new item, and click on COMClass

Add a public method to it.

Build the project, the class should now be registered - check the references window in vb6 to find the assembly name there.

Note that .Net does not work through registry entries as COM does - as such, if you want to use this class from .Net you need to add a reference to the assembly you just built, and unless you add it to the GAC every .net program that does reference it will need it's own copy (Visual studio will copy it for you, but if you're using the command line compiler, then you'll need to copy it manually).

Also note that to use the binary from com, it will have to be registered in the machine you want to use it from - use regasm for that.

AlexMoura at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 4
express version doesn't offer COMClass as an add item; however it does have the property COMClass true which appears to do the same. Unfortunately, I've done all that and more (and less depending on the instructions one reads). No luck. Only the class and an enum are recognized in both .NET and COM apps. The property, functions and subs are not available at all (all publics are set as COM Visible true).
rwbogosian at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 5
It should still be possible to do this - I don't have express installed, so I can't try it out, but play with this:
Create a Class library, select view all and open the assemblyinfo.vb file - set the assembly level comvisible attribute to true
On a class with public methods, add the comclass attribute
Build the assembly
Register the built binary with Regasm /tlb (unless the assembly is GAC'd you may also need /codebase for this to work, I'm a bit rusty on that)
That should do it, I've just made it work with command line tools only - check to see if vb6 allows you to use it.
AlexMoura at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 6
>If the COM visible DLL is not a legend then I challenge all forum participants to provide one simple, clear-cut, straightforward, step by step explanation of how to create a COM visible .NET DLL.
How about doing it the other way around? You post your current solution somewhere and we try to help you find what's wrong.

MattiasSj?gren at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 7

Three reason that I'd prefer not to: 1) proprietary software, 2) quite long, 3) I have many different versions all based on the varying information I've read on the MSDN site and instructions from posters. Of course, this brings me back to an earlier question: Is there one basic, straightforward way to create a COM class? In my previous posts (several threads because I've been looking for this information for more than a week), I mentioned some of the methods tried: COM Class true, visible, etc.; with & w/out GUIDs; regasm'd, sn'd & gacutil'd (or not); w/ interface or w/out; and more. In some cases, the process is self-registering (preferred) in others the utils mentioned above are used.

Isn't there one, basic way create a COM class? All the variations serve specific purposes but until the properties, functions & subs are visible (yes, their properties are marked w/ visible true), the COM class is useless. I would imagine that is the essential question. How does one make properties and methods visible to other programs? The class has been recognized tho sometimes does and sometimes doesn't show up in the COM list (under Add Reference) in VB6, 2003 & 2005 Express. I could go back to using VB6 since the procedure is much easier to implement.

I know it can be done but so far no has been able to describe the process (a complete working solution; not a repeat of the bits and pieces on MSDN). I have seen other postings about similar problems on this forum and various others on the web. None that I have seen received a working response. So, I know I am not the only person with this problem. Perhaps sample code exists on the exact procedure for doing this. Again, a complete working com class (not disjointed bits & pieces).

BTW, the part about "legend" and "challenge" is a tongue in cheek approach to attract attention. It seems to be working because, of all the threads I've started on this subject, this has gotten the most response.

rwbogosian at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 8
Here's one of many methods I tried that does not work (IMyExampleClass1 is in a module); after build, I ran regasm MyExampleClass.dll /tlb:MyExampleClass.tlb; the dll can be added as a reference in but the property, sub and function are not available:

<Microsoft.VisualBasic.ComClass()> Public Class MyExampleClass1
Implements IMyExampleClass1

'Field
Private m_MyPrivateExampleField As Integer

Public Property MyPublicExampleProperty() As Integer Implements IMyExampleClass1.MyPublicExampleProperty
Get
Return m_MyPrivateExampleField
End Get

Set(ByVal value As Integer)
m_MyPrivateExampleField = value
End Set
End Property

'New - constructor required as is or class will not register properly
Public Sub New()

MyBase.New()

End Sub

Public Sub MyPublicExampleSub(ByVal s As String) _
Implements IMyExampleClass1.MyPublicExampleSub

MsgBox(s)

End Sub

Public Function MyPublicExampleFunction(ByVal x As Integer, ByVal y As Integer) _
As Integer Implements IMyExampleClass1.MyPublicExampleFunction

MyPublicExampleFunction = x * y

End Function

End Class

rwbogosian at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 9
The link below is an excellent example of the type of information for which I am looking; it is from the VB6 documentation. Does anything like this exist for creating DLLs in VB2005?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconcreatinganinprocesscomponent.asp

rwbogosian at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 10

Hope this helps

Making a COM object in VS2005

Start a vis studio project and make a class library.

In the class library, have an Interface section and then have a a procedure which Implements this (implements keyword). See the example attached.

Tick ON the COM Visible box (you’ll find it eventually)

Start a vis studio command window ( start programs-> vis studio tools)

Use the SN tool to make a strong name key pair -> SN/k democom.snk

Using Project-> Properties -> Signing, select this file as the key file – signs the assembly. If you don’t do this , you cannot put the assembly in the global assembly cache

Build the class library

With the vis studio command window, navigate to the assembly dir

Use REGASM /tlb:democom.tlb democom.dll

This registers the dll and the type library, and it also creates the type library

Use GACUTIL /I democom to insert the democom assembly in the global cache

Now go to VB6, or VBA and add a REFERENCE tot the progect. Democom appears in the list so tick it ON

Article at

http://whidbey.msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/callnetfrcom.asp

title “Calling a .net Component from a COM components” (Mike Gunderloy)

was used as the basis for this procedure – although the detail of the operations is different


attachments:::

VB6 code to use democom

Private moTempClass As demoCOM.NET_Temperature

Private moTemp As demoCOM.iTemperature

Private Sub Command1_Click()

With moTemp

.Fahrenheit = txtfahrenheit.Text

TxtCelsius.Text = .GetCelsius

End With

End Sub

Private Sub Form_Load()

Set moTempClass = New demoCOM.NET_Temperature

Set moTemp = moTempClass

End Sub


DEMOCOM source VB.Net

Public Interface iTemperature

Property Celsius() As Double

Property Fahrenheit() As Double

Function GetCelsius() As Double

Function GetFahrenheit() As Double

End Interface

Public Class NET_Temperature

Implements iTemperature

Private mdblCelsius As Double

Private mdblFahrenheit As Double

Public Property Celsius() As Double _

Implements iTemperature.Celsius

Get

Celsius = mdblCelsius

End Get

Set(ByVal Value As Double)

mdblCelsius = Value

mdblFahrenheit = ((Value * 9) / 5) + 32

End Set

End Property

Public Property Fahrenheit() As Double _

Implements iTemperature.Fahrenheit

Get

Fahrenheit = mdblFahrenheit

End Get

Set(ByVal Value As Double)

mdblFahrenheit = Value

mdblCelsius = ((Value - 32) * 5) / 9

End Set

End Property

Public Function GetCelsius() As Double _

Implements iTemperature.GetCelsius

GetCelsius = mdblCelsius

End Function

Public Function GetFahrenheit() As Double _

Implements iTemperature.GetFahrenheit

GetFahrenheit = mdblFahrenheit

End Function

End Class


awaterman at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...
# 11

Did you finally get to use .NET component as COM components. If yes, please give me the solution because I've been thrue all what you 've been and there is no way I get to use it in an excel VBA module.

I can see properties, functions, subs but I can't creat instance of the object via

set a = new dllname.class

Please help !

thanks

srbietho at 2007-9-8 > top of Msdn Tech,Visual Basic,Visual Basic Language...