powodu ograniczeń firmy z mojej kontroli, mam następujący scenariusz:wynikających interfejsy COM w .NET
bibliotekęCOM, który określa następujące interfejs (nie CoClass, po prostu interfejs):
[
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;
};
Mam COM (napisane w/C++), który implementuje oba interfejsy i zapewnia nasze aplikacje z tej usługi. Wszystko jest w porządku, myślę.
Próbuję zbudować nowy IProvider
i IService
w .NET (C#).
I został zbudowany Primary Interop Assembly dla biblioteki COM i realizowane następujące 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
}
Przy próbie poślizgu to do istniejącego środowiska wykonawczego, jestem w stanie utworzyć obiekt NewProvider
od COM (C++) i QueryInterface
dla IServiceProvider. Kiedy próbuję wywołać metodę na IServiceProvider, generowany jest System.ExecutionEngineException
.
Jedyne, co mogę znaleźć, to patrząc na pliki .tlh utworzone przez #import, pokazuje starszą klasę COM IExistingProvider poprawnie pokazuje, że pochodzi ona od IServiceProvider. Jednak klasa .NET pokazuje bazę IDispatch. Nie jestem pewien, czy to znak, wskazówka, pomocna, coś jeszcze.
Kiedy mówisz, że już "wbudowany" a Primary Interop Assembly, to znaczy od podstaw ? Czy nie było możliwe dodanie biblioteki COM jako punktu odniesienia? – ilitirit
Zbudowałem PIA z TLBIMP.exe. Czy chcesz zobaczyć przykładowy wiersz poleceń? Użyłem TLBIMP, tworząc własny plik Interop.Services.dll, a następnie odwołuję się do tego. Niedawno poznałem ".NET i COM - przewodnik po pełnej interoperacyjności". – DevSolo
Czy istnieje powód, dla którego nie zaimportowano biblioteki bezpośrednio do programu Visual Studio, czy też nie używasz programu Visual Studio? – ilitirit