Solved

VB.Net and C# default property woes

Posted on 2006-12-01
3
603 Views
Last Modified: 2008-01-09
The project I'm working on is to replace the Excel COM object with a .NET COM wrapper.  This will then allow for 3rd party spreadsheet applications (like OpenOffice) to emulate Excel for 3rd party applications that use Excel's API.

Now, I know AutomateIT has already started doing this, but I feel .NET is a better platform for developing this on, since it now becomes rather easy to implement this library on Linux platforms (thanks to projects like Wine, Mono and DotGNU.)

So far, I have suceeded with wrapping a few of the objects, but I'm having a particularly hard time with default properties in any .NET language.

For example, let's say that I have the following property defined in VB.NET, and have the classes DefaultProperty pointed at this (this is a function from a class named CollectionBase, which is what I'm using as a base for all collections I define):

    Public ReadOnly Property Item(ByVal index As Object) As Object
      Get
        Try
          Dim i As Integer = 0
         
          If (index.GetType().Name = "Int16") Or (index.GetType().Name = "Int32") Then
            Dim indexValue As Integer = Integer.Parse(index.ToString())
            For Each key As String In objColl.Keys
              If i = (indexValue - 1) Then
                Return Me.objColl(key)
              End If
             
              i += 1
            Next
          ElseIf index.GetType().Name = "String" Then
            Return Me.objColl(index)
          End If
        Catch e As Exception
          System.Windows.Forms.MessageBox.Show(e.Message)
          System.Windows.Forms.MessageBox.Show(e.StackTrace)
        End Try
       
        Return Nothing
      End Get
    End Property


If I do the following code in a WSH batch file:  Set wb = Application.Workbooks.Item(1)
It will return the first workbook in the collection.  But, if I do:  Set wb = Application.Workbooks(1)
It will give a scripting exception.

If you do the same two commands using the original Excel COM object, they both do exactly the same thing: return the first workbook.

I have tried doing the above, as well as defining default properties in C# code (by defining the "this[object index]" property)...but the WSH script still doesn't work.


Does anyone have suggestions on how I can get "Set wb = Application.Workbooks(1)" to work from WSH through my implementation of the Excel COM object?
0
Comment
  • 2
3 Comments
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 295 total points
ID: 18057282
I don't work with COM but try adding the Default keyword in there.

So make:

    Public ReadOnly Property Item(ByVal index As Object) As Object

This:

    Default ReadOnly Property Item(ByVal index As Object) As Object

See:
http://msdn2.microsoft.com/en-gb/library/se6z814t(VS.80).aspx
0
 

Author Comment

by:Lost_In_JavaScript_Land
ID: 18068090
Unfortunately, that didn't work.  I also did a simple experiment where I exposed a Hashtable to COM (since a Hashtable uses default properties to access each object by it's key):

Imports System.Runtime.InteropServices
Imports System.Collections
Imports System.Reflection
Imports System

Namespace MyAssembly
    <ComVisible(True)> Public Class MyVBClass
        Private objHash As Hashtable

        Public Sub New()
            objHash = New Hashtable()
        End Sub

        Public ReadOnly Property myHashTable() As Hashtable
            Get
                Return objHash
            End Get
        End Property
    End Class
End Namespace

Then, using the following VBS script (which is just a text file with a .vbs extension):

set xapp = WScript.CreateObject("MyAssembly.MyVBClass")

xapp.myHashTable.add "abc", 1
MsgBox "Call #1: " & xApp.myHashTable.Item("abc")
MsgBox "Call #2: " & xApp.myHashTable("abc")


This code will execute the first message box fine, but the second one will throw an exception:
Wrong number of arguments or invalid property assignment: 'xapp.myHashTable'

Any thoughts?  Thanks! :)
0
 

Author Comment

by:Lost_In_JavaScript_Land
ID: 18071576
I guess the solution that I was trying to implement was rather complex for my specific situation.  All I had to do was create an Application object which inherits Microsoft.Office.Interop.Excel.ApplicationClass, and I was able to do what I needed to do (although Excel has to be installed on the system.  blah.)

But, Idle_Mind, since your solution above did help me to eventually find a solution, I will award you the points.  :-)
0

Featured Post

Active Directory Webinar

We all know we need to protect and secure our privileges, but where to start? Join Experts Exchange and ManageEngine on Tuesday, April 11, 2017 10:00 AM PDT to learn how to track and secure privileged users in Active Directory.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

IP addresses can be stored in a database in any of several ways.  These ways may vary based on the volume of the data.  I was dealing with quite a large amount of data for user authentication purpose, and needed a way to minimize the storage.   …
This article describes relatively difficult and non-obvious issues that are likely to arise when creating COM class in Visual Studio and deploying it by professional MSI-authoring tools. It is assumed that the reader is already familiar with the cla…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

808 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question