2016-09-25 3 views
0

Wir versuchen, BrokeredComponents auf UWP zu verwenden. Wir erhalten entweder TypeLoadException oder InvalidCastException.BrokeredComponents TypeLoad und InvalidCastException

Wir definieren eine Klasse namens BrokeredComponentsHost, die als allgemeine Klasse verwendet wird, damit wir auf andere Klassen in BrokeredComponents zugreifen können.

Wir verwenden GUIDs für jede der Komponenten. Hier

ist die BrokeredComponentsHost:

namespace BrokeredComponents 
{  
    [Guid(BrokeredComponentsHost.ClassId), ComVisible(true)] 
    public sealed class BrokeredComponentsHost : IBrokeredComponentFactory 
    { 
     internal const string ClassId = "881724C4-E330-40D5-BDA1-7D9F7C44FB7C"; 
     internal const string FactoryInterfaceId = "1FA85472-5B0D-487C-B58E-F8BE9A89D470"; 
     internal const string BarcodeScannerInterfaceId = "840F54D5-7AF7-4C31-91B0-BA274FCDD737"; 

     public string LastError { get; set; } 

     public IPosScanner GetPosScanner() 
     { 
      return new PosScanner() { Host = this }; 
     } 
    } 

} 

Dies ist IBrokeredComponentsFactory:

namespace BrokeredComponents 
{ 
    [Guid(BrokeredComponentsHost.FactoryInterfaceId), ComVisible(true)] 
    public interface IBrokeredComponentFactory 
    { 
     IPosScanner GetPosScanner(); 
     string LastError { get; set; } 
    } 
} 

Und das ist die PosScanner und seine Schnittstelle:

namespace BrokeredComponents 
{ 
    [Guid(BrokeredComponentsHost.BarcodeScannerInterfaceId), ComVisible(true)] 
    public interface IPosScanner : IPosDevice 
    { 
     bool DecodeData { get; set; } 
     bool DeviceEnabled { get; set; } 
     bool DataEventEnabled { get; set; } 
     bool AutoDisable { get; set; } 
     byte[] ScanData { get; } 
    } 
} 

Wenn wir versuchen, eine erstellen neue Instanz von BrokeredComponentsHost (bcHost = new BrokeredComponents.BrokeredComponentsHost();) es löst TypeLoadException aus.

Wenn wir eine neue Klasse (z. B. ProcessExecutor-Klasse) definieren, alles neu erstellen und dann versuchen, eine neue Instanz von BrokeredComponentsHost erneut zu erstellen, wird stattdessen InvalidCastException ausgelöst.

Wir tun icacls./T/gewähren "ALLE ANWENDUNGSPAKETE": RX und regsvr32 theproxy.dll.

Hat jemand das gleiche Problem und kennt die Lösung?

Vielen Dank!

Edit: Die genaue Fehlermeldung, die ich erhalten, ist "Unable to cast COM object of type 'BrokeredComponents.BrokeredComponentsHost' to interface type 'BrokeredComponents.IBrokeredComponentFactory'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{1FA85472-5B0D-487C-B58E-F8BE9A89D470}' failed due to the following error: Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))."

ich unter Windows 10 64-Bit leite, aber mein BrokeredComponents Projekt ist von Windows 8.1 und BrokeredComponentsProxy ist VS 2013

Edit 2: Ich habe Die TypeLoad-Ausnahme wurde behoben, es war ein Fehler bei den Erweiterungen für die exponierte Klasse, die nicht in der Appxmanifest-Datei definiert wurde. Ich stehe immer noch auf InvalidCastException.

+1

> Klasse nicht registriert Haben Sie das Proxy-Stub-Projekt in VS als Administrator neu erstellt? Sieht aus wie das ist, was diese COM-Ausnahme angibt –

+1

Haben Sie Ihre Referenzen die richtige Winmd-Datei hinzugefügt? Es sollte 2 Winmd-Datei, eine davon sollte als Referenz zu Ihrem Projekt hinzugefügt werden und die andere ist die Implementierung, sollte es immer gehen, wo der Proxy ist. – Lance

Antwort

0

Dank Franklin und Lawrence.

Ich habe den Fehler herausgefunden, weil das Haupt-UWP-Projekt auf x64 ausgerichtet war, während unsere BrokeredComponents und andere Projekte in der Lösung auf x86 ausgerichtet sind.

Ich änderte UWP-Projekt zu x86 und registrierte die .dll und funktioniert jetzt perfekt.

Verwandte Themen