Aufgrund Unternehmen Zwänge aus meiner Kontrolle, habe ich folgendes Szenario:Ableitung COM-Schnittstellen in .NET
Ein COM-Bibliothek, die die folgende Schnittstelle (keine CoClass, nur die Schnittstelle) definiert:
[
object,
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
dual,
nonextensible,
helpstring("IService Interface"),
pointer_default(unique)
]
IService : IDispatch
{
HRESULT DoSomething();
}
[
object,
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
dual,
nonextensible,
helpstring("IProvider Interface"),
pointer_default(unique)
]
IServiceProvider : IDispatch
{
HRESULT Init(IDispatch *sink, VARIANT_BOOL * result);
HRESULT GetService(LONG serviceIndicator, IService ** result);
};
[
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
version(1.0),
]
library ServiceLibrary
{
importlib("stdole2.tlb");
interface IService;
interface IServiceProvider;
};
Ich habe eine COM (geschrieben w/C++), die beide Schnittstellen implementiert und bietet unsere Anwendung (en) mit diesem Dienst. Alles ist gut, denke ich.
Ich versuche, eine neue IProvider
und IService
in .NET (C#) zu bauen.
ich eine primäre Interop-Assembly für die COM-Bibliothek erstellt habe, und implementiert die folgenden C#:
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public interface INewService : IService
{
// adds a couple new properties
}
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public class NewService : INewService
{
// implement interface
}
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public interface INewProvider : IServiceProvider
{
// adds nothing, just implements
}
[ComVisible(true)]
[Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public class NewProvider : INewProvider
{
// implement interface
}
Wenn ich versuche, diese in die bestehenden Laufzeit zu rutschen, ich bin in der Lage, das NewProvider
Objekt erstellen aus COM (C++) und QueryInterface
für IServiceProvider. Wenn ich versuche, eine Methode auf dem IServiceProvider aufzurufen, wird System.ExecutionEngineException
ausgelöst.
Die einzige andere Sache, die ich finden kann, ist durch Blick auf die TLI-Dateien von der #import erstellt, zeigt die Legacy COM IExistingProvider-Klasse zeigt richtig, dass es von IServiceProvider abgeleitet ist. Die .NET-Klasse zeigt jedoch eine Basis von IDispatch. Ich bin mir nicht sicher, ob dies ein Zeichen, eine Indikation, hilfreich oder etwas anderes ist.
Wenn Sie sagen, Sie haben "gebaut" eine primäre Interop-Assembly, meinen Sie von Grund auf neu ? Ist es nicht möglich, die COM-Bibliothek als Referenz hinzuzufügen? – ilitirit
Ich baute den PIA aus der TLBIMP.exe. Möchten Sie eine Beispielbefehlszeile dafür sehen? Ich habe TLBIMP verwendet, meine eigene Interop.Services.dll erstellt, dann verweisen Sie darauf. Ich habe vor kurzem ".NET und COM - The Complete Interoperability Guide" erworben. – DevSolo
Gibt es einen Grund, warum Sie die Bibliothek nicht direkt in Visual Studio importiert haben oder Visual Studio nicht verwenden? – ilitirit