Registrieren meine .net Assembly für COM-Interoperabilität aussetzt nicht meine Methoden

StackOverflow https://stackoverflow.com/questions/1001129

  •  05-07-2019
  •  | 
  •  

Frage

Ok, ich werde verrückt. Ich habe versucht, eine einfache .NET-Assembly sichtbar zu machen, wie ein COM-Objekt zu verwenden, aber es funktioniert nicht. Ich habe eine Menge verschiedenen aproaches versucht, aber keiner von ihnen arbeiten. Bisher ist die nächste, die ich habe ist derjenige mit der geringsten Menge von Attributen, Schnittstellen, manuell Registrierung etc.

Ich habe einen Vbscript als Test, der wie folgt aussieht:

Dim o
o = CreateObject("MyNamespace.MyClass")
msgbox o.Test()

Meine c # Code sieht wie folgt aus:

using System;
using System.Runtime.InteropServices;
namespace MyNamespace 
{
  [ProgId("MyNamespace.MyClass")]
  public class MyClass
  {
    public string Test()
    {
       return "teststring";
    }
  }
}

Auf meinem Projekt (VS2008) i ‚Montage COM sichtbar machen‘ ausgewählt haben -., Die ein Attribut zu meinem AssemblyInfo.cs hinzugefügt, und ich habe auch überprüft ‚für COM-Interop registrieren‘

Ich kann sehen, dass die ProgId wirklich keinen Unterschied (in meinem Fall sowieso) macht - solange ich die realen Namespace + Klassennamen angeben, i aber es außer Kraft setzen kann, die ich denke, ist schön

.

Das Problem ist - mein Create gut geht, aber die Methode Test () kann nicht gefunden werden. In der Tat, wenn ich nehmen Sie die dll und extrahieren Sie die TLB und erwarten, dass ich überhaupt keine Methoden zu sehen.

Der Fehler, den ich bekommen, ist dies:

  

C: \ inetpub \ wwwroot \ ASPTest \ testrun.vbs (3,   1) Microsoft VBScript-Laufzeitfehler:   Das Objekt unterstützt diese Eigenschaft   oder Methode: 'Test'

würde ich jedes Feedback lieben, aber nur, damit Sie wissen, was ich versucht habe. Ich habe um mit Guid und AttributeGuid auf die Klasse Messing, die Definition der ComVisible ausdrücklich auf die Klasse als auch habe ich versucht, nicht für COM-Interop-Registrierung und stattdessen tat regasm / Code-Basis / regfile.

Eine letzte Anmerkung -. Die meisten meine Tests um eine nicht-signierte Assembly gedreht haben, aber versuchen, den Fehler, den ich mit einem Strong / Schlüssel und versuchte zu ermitteln, aber es hat nichts tun

Kann mir jemand helfen das Problem zu finden, bitte?

War es hilfreich?

Lösung 2

begann ich von Anfang an und entfernt alles, was in Bezug auf COM-Interop auf meinem Projekt, ich dann hinzugefügt

[Guid(...some guid...)]
[ComVisible(true)]

auf MyClass und fügte ich einen Strong (die Projekteinstellung verwendete es einrichten -., Statt sie in der AssemblyInfo.cs definieren

Wenn ich die Assembly kompiliert, ich kopiert die Dateien an einen anderen Ort, wo ich ein tat

regasm MyNamespace.MyClass.dll /codebase /regfile

Dann lief ich und nahm den Registrierungseintrag.

Das machte es funktioniert - wenn ich Änderungen vornehmen ich nur neu kompilieren und die Dateien über den alten (ohne das Aufheben der Registrierung) kopieren und dann ich nur tun:

regasm MyNamespace.MyClass.dll /codebase

... und das ist es -. Änderungen, die ich an MyClass gemacht imediately sichtbar sind in meinem Vbscript und in meiner ASP-Seite

Andere Tipps

Habe ich erwähnt, ich Windows 7 RC 64-Bit laufen?

Nun, ich denke, dass könnte erklären, mein VS tut es nicht richtig: http://kbalertz.com/956933/Issues-building-project-assembly. aspx Es scheint, VS die 32-Bit-Version von Registry verwendet und nicht die 64-Bit ...

Sie nicht benötigen Sie eine Schnittstelle zu definieren, die die Methoden hat, und diese Schnittstelle implementieren?

Dies funktioniert für mich:

using System;
using System.Runtime.InteropServices;
namespace MyNamespace
{

    [GuidAttribute("8DDE02DF-B31C-4d91-98A7-C64444701985")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class clsCOMWraper
    {
       public string Test()
      {
         return "teststring";
      }
    }
}

Thse Montage muss unterzeichnet werden.

Das, registrieren Sie mit regasm / Codebase

Ich sehe nicht jeden Konstruktor für die Klasse. COM Interop muss einen Standardkonstruktor (ohne params) für eine COM-Schnittstelle erfolgreich zu erzeugen.

Versuchen Sie, einen Konstruktor hinzufügen und sehen, ob es funktioniert.

diesen Link überprüfen Sie es perfekt funktionieren ich es folgen und gibt perfekte Lösung über den Fehler wie „Objekt nicht unterstützt diese Eigenschaft oder Methode“ Code Project Hilfe

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top