Я использую Microsoft CSExeCOMServer в качестве основы для настройки COM-сервера вне процесса, но он не работает должным образом. Сервер 64-битный, а клиент 32-битный.
Вот пример интерфейса
[Guid(XXCryptService.InterfaceId), ComVisible(true)/*, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)*/]
public interface IXXCryptService
{
[DispId(1)] string Encrypt(string password, string key);
[DispId(2)] string Decrypt(string password, string key);
}
И класс
[ClassInterface(ClassInterfaceType.None)]
[Guid(XXCryptService.ClassId), ComVisible(true)]
public class XXCryptService : ReferenceCountedObject, IXXCryptService
{
internal const string ClassId =
"C5F6938B-5593-4872-B8C7-B47EE33EABCD";
internal const string InterfaceId =
"6990FF5F-22E2-4032-8B98-36115DBCEFFF";
[EditorBrowsable(EditorBrowsableState.Never)]
[ComRegisterFunction()]
public static void Register(Type t)
{
try
{
COMHelper.RegasmRegisterLocalServer(t);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw ex;
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
[ComUnregisterFunction()]
public static void Unregister(Type t)
{
try
{
COMHelper.RegasmUnregisterLocalServer(t);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw ex;
}
}
public string Encrypt(string password, string key)
{
return "Encrypted";
}
public string Decrypt(string password, string key)
{
return "Decrypted";
}
}
Программа запускается, но при подключении клиента происходит сбой на клиенте после того, как сервер вызвал CreateInstance для ObjectClassFactory и возвратил объект в ppvObject с помощью Marshal.GetComInterfaceForObject (new XXCryptService (), typeof (IXXCryptService) и вернул его 0.
Запуск клиента в .NET вызывает «Невозможно привести COM-объект типа« COMTest.XXCryptService »к типу интерфейса« COMTest.IXXCryptService ». Эта операция завершилась неудачно, потому что QueryInterface вызывает компонент COM для интерфейса с IID» {6990FF5F-22E2-4032-8B98-36115DBCEFFF} 'не удалось из-за следующей ошибки: Элемент не найден. (Исключение из HRESULT: 0x8002802B (TYPE_E_ELEMENTNOTFOUND)). ".
[Guid("6990FF5F-22E2-4032-8B98-36115DBCEFFF")]
//[InterfaceType(ComInterfaceType.InterfaceIsDual)]
interface IXXCryptService
{
[DispId(1)] string Encrypt(string password, string key);
[DispId(2)] string Decrypt(string password, string key);
}
[ComImport, Guid("C5F6938B-5593-4872-B8C7-B47EE33EABCD")]
class XXCryptService
{
}
class Program
{
static void Main(string[] args)
{
XXCryptService cs = new XXCryptService();
IXXCryptService ics = (IXXCryptService) cs;
Console.WriteLine(ics.Encrypt("Test","Test"));
Console.ReadKey();
}
}
Запуск клиента в Delphi вызывает исключение в EIntfCastError с сообщением «Интерфейс не поддерживается». COM импортируется с помощью «Библиотеки типов импорта» и используется следующим образом.
procedure TForm1.FormCreate(Sender: TObject);
begin
FCrypter := CoXXCryptService.Create;
end;
Интерфейс TLB выглядит следующим образом
IXXCryptService = interface(IDispatch)
['{6990FF5F-22E2-4032-8B98-36115DBCEFFF}']
function Encrypt(const password: WideString; const key: WideString): WideString; safecall;
function Decrypt(const password: WideString; const key: WideString): WideString; safecall;
end;
// *********************************************************************//
// DispIntf: IXXCryptServiceDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {6990FF5F-22E2-4032-8B98-36115DBCEFFF}
// *********************************************************************//
IXXCryptServiceDisp = dispinterface
['{6990FF5F-22E2-4032-8B98-36115DBCEFFF}']
function Encrypt(const password: WideString; const key: WideString): WideString; dispid 1;
function Decrypt(const password: WideString; const key: WideString): WideString; dispid 2;
end;
Я проверил реестр, и все, кажется, зарегистрировано должным образом, поэтому я не понимаю, почему я должен получить эту проблему.
Кто-нибудь здесь знает, в чем может быть проблема?
Редактировать: скомпилированный клиент в 64-битной, и это работает правильно. Кроме того, он ссылался на неправильный путь, после того, как я настроил его, я получил другую ошибку на клиенте .NET x86
Эта операция завершилась неудачно, так как произошел сбой вызова QueryInterface COM-компонента для интерфейса с IID '{6990FF5F-22E2-4032-8B98-36115DBCEFFF}' из-за следующей ошибки: Ошибка загрузки библиотеки типов / DLL. (Исключение из HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))