2009-07-20 7 views
2

Ich habe eine .NET-Assembly, in C# geschrieben. Es ist ComVisible markiert, hat eine GUID, ist signiert, regasm'd (/ codebase). Ich habe formal keine Schnittstelle für den COM-Teil definiert.Wie Debuggen "Falsche Anzahl der Argumente oder ungültige Zuweisung von Eigenschaften" VBScript .NET Interop

Ich benutze diese Baugruppe über VBscript.

Es gibt eine überladene Methode - eine Form nimmt ein einzelnes String-Argument, und die zweite nimmt zwei Strings. Beide geben einen anderen .NET-Typ von derselben Assembly zurück. Ich nenne es so:

set foo = WScript.CreateObject("Prog.Id") 
' the following succeeds 
set bar = foo.Method1("string") 
' the following fails 
set baz = foo.Method1("string1", "string2") 

Der erste Aufruf von Methode1 ist erfolgreich. Der zweite schlägt fehl mit "Falsche Anzahl der Argumente oder ungültige Zuweisung von Eigenschaften".

Wie kann ich dies debuggen?

In Tests, wenn ich eine hirntot einfache .NET-Klasse mit Überladungen wie folgt definieren, kann ich es aus VBScript aufrufen, kein Problem. Es gibt etwas anderes an meiner "echten" Versammlung, die das zum Scheitern bringt. Wie finde ich heraus, was es ist?

Antwort

2

Ich bin mir nicht sicher, ob dies wirklich der Fall ist, aber es scheint, dass COM erlaubt keine der Methoden Überlastung: here oder here

Die ersten Links scheint darauf hinzudeuten, dass es um das ein Weg sein kann (mit einer expliziten Schnittstellendefinition und Attributen vielleicht?), aber ich bezweifle es.

Sie können auch die resultierende Typenbibliothek mit OleView.exe überprüfen, um zu sehen, wie Ihre beiden Methoden für COM-Clients aussehen, nachdem Sie tlbexp in Ihrer Assembly verwendet haben.

+0

Ah, ja, ich denke das ist die Antwort. – Cheeso

0

Weitere Informationen hierzu: Während COM keine Überladung von Methoden "erlaubt", wird das CCW, das in einer .NET-Klasse generiert wird, die überladene Methoden verwendet, alle Überladungen aussetzen. Mit anderen Worten, eine COM-basierte Umgebung wie VBScript kann auf alle Überladungen einer .NET-Klasse zugreifen. Einige der Überladungen erhalten verstümmelte Namen.

Nehmen wir an, es gibt eine Klasse, die drei Methoden mit dem Namen Extract() verfügbar macht. Die erste Überladung heißt Extract(). Die anderen sind mit den Suffixen _2 und _3 benannt.

Was bestimmt, welche Überladung "die erste" Überladung ist und welche die verfälschten Namen bekommen? Ich weiß es nicht. Es kann die Reihenfolge des Auftretens der Methoden in der Baugruppe sein. Aber was bestimmt diese Ordnung? Hier wieder, ich weiß es nicht.

Die einzige Möglichkeit zu bestimmen, welche Überlastung bestimmt ist, ist die CCW in der OleView zu sehen.

Verwandte Themen