Frage

Ich versuche, unsere Bibliothek über COM zu belichten aber scheinen die Werkzeuge, mehr als das eigentliche Problem zu kämpfen. Unabhängig davon, wie ich meine COM ausgesetzt Klasse schreiben erhalte ich die Warnung: „xxx.dll keine Typen enthält, die für COM-Interop registriert werden kann“ (markiert Projekt als Register für COM-Interop in den Projekteigenschaften). Selbst die einfache Klasse unten (als die einzige Klasse in einer Baugruppe, die signiert ist und dem mit ComVisible (false)) noch verharrt Warnung:

  [Guid("77699130-7D58-4d29-BE18-385871B000D1")]
  [ComVisible(true)]
  public interface IExample
  {
    string GetText();
    void SetText(string text);
  }

  [Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
  [ComVisible(true)]
  public class Example : IExample
  {
    private string m_text = "default text";

    public string GetText()
    {
      return m_text;
    }

    public void SetText(string text)
    {
      m_text = text;
    }
  }

Ich habe versucht, regasm von der Kommandozeile auf dem Ausgang laufen, die gerne Zustände „Typen erfolgreich registriert“. Doch mit dem / verbose keine zusätzliche Informationen laufen wechseln angezeigt wird (ich mich zu erinnern, dass es den Namen auflistet oder vielleicht nur die Zahl der registrierten Typen). Auch versucht mit dem / regfile Schalter läuft regasm eine regfile zu erzeugen, die diese erzeugt:

[HKEY_CLASSES_ROOT\ComExample.Example]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\ComExample.Example\CLSID]
@="{F91E5EE1-D220-43B5-90D1-A48E81C478B7}"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32\1.0.0.0]
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\ProgId]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

Ich bin kein COM-Assistent von Maßnahmen, aber die Registrierung sieht für mich gültig. Aber nichts scheint in der Registrierung zu erscheinen, wenn regasm auf der Baugruppe ausgeführt wird.

Also meine Frage ist, ob ich etwas in meinem einfachen Beispiel bin fehle die Registrierung der Arbeit zu haben, sehe ich falsche Angaben und ist die Anmeldung tatsächlich richtig und wie kann ich besser bestimmen, ob die COM-Registrierung tatsächlich funktioniert

EDIT: etwas registriert tatsächlich bekommen in der Registrierung mit regasm direkt (nichts in der Registrierung von nur der VS2008-Integration) unter Verwendung der von Kev vorgeschlagenen Änderungen konnte ich nicht die Warnungen von VS2008 vermeiden, aber ich konnte.

Ich habe dann versucht, die einfache Klasse zu entfernen, so dass ich eine leere Baugruppe hatte. Laufen regasm darüber berichten hat keine Art von Warnungen, nur „Typen erfolgreich registriert“. Ich sehe Warnungen wie „RegAsm: Warnung RA0000: Keine Typen wurden registriert“ beim Laufen RegAsm auf einige meiner anderen Baugruppen, die fälschlicherweise für COM verfügbar gemacht werden kann. Was ist hier los, ich kann alles außer der Registrierung vertrauen und was ist mit den Ein / Aus-Warnungen von regasm?

War es hilfreich?

Lösung

Ich habe Projekt eine Klassenbibliothek auf dem Code basiert wie folgt:

In der Projekteigenschaften Seite, wählen Sie die Registerkarte Signatur. Überprüfen Sie die ‚Zeichen der Baugruppe‘ Checkbox und wählen Sie <New...> aus dem ‚Wählen Sie einen starken Namen Schlüsseldatei:‘. Dropdown-Feld

Ich habe dann die folgende Klasse (Example.cs):

[Guid("77699130-7D58-4d29-BE18-385871B000D1")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IExample
{
    [DispId(1)]
    string GetText();

    [DispId(2)]
    void SetText(string text);
}

[Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Example : IExample
{
    private string m_text = "default text";

    [ComVisible(true)]
    public string GetText()
    {
      return m_text;
    }

    [ComVisible(true)]
    public void SetText(string text)
    {
      m_text = text;
    }
}

Ich baute dann das Projekt dann in eine Befehlszeile fallen gelassen, wo die DLL Ausgabe aus dem Build war.

Zur Anmeldung:

  

regasm.exe COMInteropTesting.dll /register /codebase /tlb

Wenn Ihre Komponente muss zugänglich, um mehrere Anwendungen sein:

  

gacutil.exe -i COMInteropTesting.dll

Das alles hat gut funktioniert unter Windows 2003 32-Bit, Windows 2008 32-Bit und Windows 7 64 Bit.

Ein Gotcha ist aber, dass, wenn Sie die Komponente zu test mit sagen CScript auf einem 64-Bit-System, müssen Sie das richtige CScript-Interpreter ausführen. Wenn Sie die Montage mit 32-Bit-RegAsm.exe (bei C:\Windows\Microsoft.NET\Framework\v2.0.50727) registriert, dann müssen Sie die 32-Bit-CScript Dolmetscher bei c:\Windows\SysWOW64 auszuführen.

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