| 

.NET C# Java Javascript Exception

3
Hallo Gruppe,

in unserem Projekt verwenden wir eine VB6 ActiveX DLL nach wie vor weiter.
Im Projekt wurde eine entsprechende Referenz hinzugefügt.
Nun fiel im Objektbrowser auf dass bestimmte Eigenschaften als set_propname bzw. get_propname Methoden umgesetzt werden.
Auf den Rechnern meiner Kollegen sind die Eigenschaften wie erwartet als Eigenschaften zu verwenden.
Was läuft auf meiner Maschine falsch?

Gruß
HowieD
News:
27.02.2013
HowieD 41 1 2
7 Antworten
0
Nutzt ihr eventuell andere Sprachen? z.B. sind Parametriesierte Properties in C# nicht erlaubt:

In C#, properties are not expected to have any parameters; however some Excel and Word properties do have parameters. These properties do appear in IntelliSense, but they appear prefixed with either get_ or set_.
27.02.2013
Floyd 14,6k 3 9
0
Natürlich gibt es den Let-Teil der Eigenschaft, der eine Parameter entgegennimmt:
Public Property Let TestString(ByVal vData As String)
mvarTestString = vData
End Property
Aber das ist Standard in VB und sollte kein Problem darstellen.
Ansonsten gibt es keine weiteren Parameter in den Eigenschaften.
27.02.2013
HowieD 41 1 2
Gibt es wirklich keine Properties in der Form

Public Property Let TestString(ByVal index as integer, ByVal Data as String)

Diese würden nämlich als set-/Get-Methoden generiert werden.
luedi 27.02.2013
0
Wenn du eine ActiveX-Komponente einbindest wird im Hintergrund von Visual Studio eine Wrapper-Klasse generiert (die heisst in der Regel AxInterop.<Name der OCX-Komponente>). Wie Floyd bereits anmerkte, sind Properties, die über einen Index angesprochen werden, in C# nicht erlaubt. In VB.NET kann man aber sehr wohl indizierte Properties definieren.

Ich vermute nun folgendes:

Wenn zum Generieren der Wrapper-dll der C#-Compiler verwendet wird, werden für die indizierten Properties set_xxx und get_xxx Methoden erzeugt. Wird der VB-Compiler verwendet, werden "normale" Properties erzeugt.

Wenn diese Vermutung richtig ist, kann ich dir aber nicht sagen unter welchen Umständen Visual Studio den VB- oder C#-Compiler für die Code-Generierung verwendet. Möglicherweise hängt das von der Visual-Studio Version ab.

Ich habe das bei mir mit Visual Studio 10 Professional SP1 ausprobiert und habe ebenfalls Set-/Get-Methoden generiert bekommen.

[Edit]
Die Informationen über die in der ActiveX-dll zur Verfügung stehenden Methoden und Properties werden in der Registry abgelegt. Hierzu wird die dll in der Regel mit dem Tool regsvr32.exe registriert. Möglicherweise ist die dll bei dir anders registriert worden als auf den anderen Rechnern. Du kannst die ActriveX-dlls jederzeit manuell mit regsvr32 /u <dll-name> bzw. regsvr32 <dll-name> deregistrieren / registrieren. Vielleicht hilft dies.

Eine weitere Möglichkeit ist, dass ihr verschiedene Versionen der ActiveX-dll installiert habt. Wie sieht es denn aus, wenn du die dll in einem VB6-Projekt referenzierst?
[End Edit]

Gruß
Klaus
27.02.2013
luedi 2,2k 1 9
luedi 2,2k 1 9
0
Hier sind die Signaturen der betreffenden Eigenschaften:
Public Property Get strConnect() As String
strConnect = Connect
End Property

Public Property Let strConnect(ByVal vNewValue As String)
Connect = vNewValue
End Property

Public Property Get KontoFormat() As String
KontoFormat = mKontoFormat
End Property

Kein wirklicher Voodoo also.
Egal welcher VS Version (VS2010 SP1, VS2012 UD1) oder welcher Compiler (C#, VB.NET) die Eigenschaften werden als Methoden (z.B. set_strConnect, get_strConnect) umgesetzt.

Noch andere Ideen?
27.02.2013
HowieD 41 1 2
Ich habe meine Antwort ein wenig erweitert. Vielleicht hilft das weiter?
luedi 28.02.2013
0
Hallo Klaus,
zu Deiner erweiterten Antwort:
was glaubst Du wie oft ich schon regsvr32 zum registrieren und deregistrieren aufgerufen habe. Mein Computer hat andere Befehle schon fast vergessen. Gibt es dort ggf. einen "geheimen" Switch der irgendetwas anders macht. Der wäre mir nach fast 20 Jahren VB Classic neu!
Soll ich mal was lustiges erzählen? Habe mal zum Spaß eine VM mit meinem Entwicklungszoo frisch aufgesetzt. Und nun kommt der Hit: VB6 Eigenschaften sind auch in .NET Eigenschaften :o
Hilft das irgendwie weiter? In einer VM zu arbeiten ist nicht wirklich mein Ziel!

Gruß
Herbert
28.02.2013
HowieD 41 1 2
Dann bin ich leider auch ratlos. Das einzige was mir noch einfällt ist, dass du die Einträge in der Registry für deine ActiveX.dll manuell löschst. Über den Namen der dll müsstest du an alle Einträge kommen. Alternativ bliebe warscheinlich nur deinen Rechner neu aufzusetzen.
luedi 01.03.2013
0
Hast Du mal versucht, AxImp.exe selbst auszuführen und Dir den SourceCode ausgeben zu lassen? Evtl. auch im Verbose Mode ausführen, um Details zu erhalten.
Befehlszeilen-Argumente zu AxImp.exe (Windows Forms ActiveX Control Importer) findest Du in der MSDN.
AxImp.exe selbst ist im Verzeichnis des Windows SDK zu finden, für Win7 32 Bit z.B. hier:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

Ob Dich das weiterbringt, weiß ich nicht. Aber einen Versuch ist es vlt. wert. Womöglich kannst Du auch die Ausgaben des Tools vergleichen, die auf Deinem fraglichen Rechner produziert werden und auf einem Deiner Kollegen (dort wo es klappt).

BTW:
In einer VM zu arbeiten ist nicht wirklich mein Ziel!
Ich würd nie wieder nicht in einer VM arbeiten wollen. Wie die Meinungen auseinandergehen...:-)
01.03.2013
ffordermaier 8,4k 3 9
0
Hallo ffordemaier,

AxImp bringt hier leider nichts, da es sich nicht um ein Control sondern um eine einfache ActiveX DLL mit ein paar öffentlichen Klassen handelt.
AxImp sucht offensichtlich nach Controls und meldet dementsprechend: "Did noct find a registered ActiveX control in ..."

Ja, ja die Meinungen. Wie heißt es so schön: 10 Anwälte 12 Meinungen;-) Aber das macht das Leben aus.

Gruß
HowieD
01.03.2013
HowieD 41 1 2
Ok, sorry, falsches Tool. Du könntest es manuell mit tlbimp.exe versuchen.
Was Du auch mal überprüfen könntest, ob Du nicht irgendein Relikt der Interop DLL im GAC liegen hast.
ffordermaier 01.03.2013
BTW: Nutze bitte für Anmerkungen die Kommentarfunktion.
ffordermaier 01.03.2013
tlbimp meldet folgendes:
warning TI3012: Error while importing type: parameter referenced a type library that is not available (type: '_FibuStammdaten'; parameter: 'IEntryId'; method: #ValidateLicenseEntry').
und
warning TI3008: Type 'FibuStammdaten' is invalid and may only be partially converted.

Der GAC ist im übrigen sauber.
HowieD 01.03.2013

Stelle deine Com-Frage jetzt!