En raison des contraintes de l'entreprise hors de mon contrôle, je le scénario suivant:Dérivation interfaces COM dans .NET
Une bibliothèque COM qui définit l'interface suivante (pas coclass, juste l'interface):
[
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;
};
J'ai un COM (écrit w/C++) qui implémente les deux interfaces et fournit notre application (s) avec ce service. Tout va bien, je pense.
J'essaye de construire un nouveau IProvider
et IService
dans .NET (C#).
J'ai construit une Assemblée interop primaire pour la bibliothèque COM et mis en œuvre les 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
}
Lorsque je tente de glisser cela dans l'exécution actuelle, je suis en mesure de créer l'objet NewProvider
de COM (C++) et QueryInterface
pour IServiceProvider. Lorsque j'essaie d'appeler une méthode sur le IServiceProvider, un System.ExecutionEngineException
est levé. La seule autre chose que je peux trouver, est en regardant les fichiers .tlh créés par le # import, montre l'ancienne classe COM IExistingProvider montre correctement qu'il est dérivé de IServiceProvider. Cependant la classe .NET montre une base de IDispatch. Je ne sais pas si c'est un signe, une indication, utile, autre chose.
Quand vous dites que vous avez "construit" une Assemblée interop primaire, voulez-vous dire à partir de zéro N'a-t-il pas été possible de simplement ajouter la bibliothèque COM comme référence? – ilitirit
J'ai construit le PIA à partir du TLBIMP.exe. Aimeriez-vous voir un exemple de ligne de commande pour cela? J'ai utilisé TLBIMP, en créant mon propre Interop.Services.dll, puis référence cela. J'ai récemment acquis ".NET et COM - le Guide complet d'interopérabilité". – DevSolo
Y a-t-il une raison pour laquelle vous n'avez pas importé la bibliothèque directement dans Visual Studio ou n'utilisez-vous pas Visual Studio? – ilitirit