Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.NET Object from VB6 without use of regasm.exe?

The software company I'm working for builds software for schools, and so our client machines are usually locked down in such a way it makes it pretty impossible for us to install anything on it.

Our old system is primarily based on a (very large) MS Access project and so it gets around the access problems by just running from a local folder.

I've been given the task of redeveloping some of the system into c# .NET - however it would be nice in the interim stages to have the ability to have the access project fire .NET things off.

I have played around with com interops for a few hours today but afaik the only way to make these work is to register them with RegAsm.exe - and unfortunately this isn't an option in the client environments.

I've tried GetObject / CreateObject but neither work when referencing a dll or tlb file, is there any other way this could be achieved?

The ideal solution would be to put the com interop dll in the same directory as the Access project.

And yes, before anyone says it, I know MS Access is evil and only suited for very small projects - but I only arrived here 4 months ago...

Marlon

like image 507
Marlon Avatar asked Dec 18 '22 02:12

Marlon


2 Answers

You could host the CLR inside Access:

Add a reference to mscoree (Probably C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscoree.tlb)

Sub Main()
    Dim CORHost As New mscoree.CorRuntimeHost
    Dim Domain As Object
    Dim AssemblyFilename As String
    Dim Classname As String
    Dim Result As Object

    AssemblyFilename = "mscorlib"
    Classname = "System.Collections.ArrayList"

    CORHost.Start
    CORHost.CurrentDomain Domain
    Set Result = Domain.CreateInstance(AssemblyFilename, Classname).Unwrap()

    Result.Add "test"
    MsgBox Result.Count
End Sub

This bypasses the need to use the registry. The down side of this is you have to use late binding with your objects.

You can also add a reference to mscorlib.tlb to get type information for the AppDomain class and others.

like image 174
Foole Avatar answered Jan 02 '23 02:01

Foole


As long as your client systems are Windows XP or later then you have the option of using Registration Free COM. This replaces the need to registry the COM components using regasm (or regsvr32 for native COM servers) in the system registry with XML configuration manifest files.

With this you still use the standard CreateObject calls to create your objects.

like image 40
shf301 Avatar answered Jan 02 '23 02:01

shf301