Как проверить, что C # /. NET COM-объект на самом деле COM-объект? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть проект C #, который создает COM-объект для использования с POS-терминалом. Прежде чем дать его клиенту, я хочу убедиться, что он будет работать как COM DLL. RegAsm говорит, что это работает.

using System;
using System.Runtime.InteropServices;

namespace POS
{
    [Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1a" )]
    [InterfaceType( ComInterfaceType.InterfaceIsDual )]
    [ComVisible( true )]
    public interface ITwoWay
    {
        // The Initialize method is called to establish the communications connection...
        [DispId( 1 )]
        void Initialize( String IPAddress, long Port, long MaxPacketSize );

        // A convenience method that allows the POS to test the Third Party’s back-end...
        [DispId( 2 )]
        void TestConnect();

        // The Terminate method is called to indicate that the POS system is about to terminate...
        [DispId( 3 )]
        void Terminate();

        // All interface calls made during a transaction send the same record format with specific reply fields ...
        [DispId( 4 )]
        void TransactionCall( String viPOSMsg, ref String InterceptArray );
    }
}

Фактические точки входа определены в классе TwoWay

using System.Runtime.InteropServices;
using System.EnterpriseServices;

namespace POS
{
    [Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1b" )]
    [ComDefaultInterface(typeof(ITwoWay))]
    [ClassInterface( ClassInterfaceType.None )]
    [ComVisible( true )]
    public class TwoWay : ITwoWay
    ...
    [ComVisible( true )]
    public void Initialize( string iPAddress, long port, long maxPacketSize )
    ...

Я думал, что смогу импортировать .tlb в другой проект .net и протестировать его таким образом, но когда я добавляю свой COM-проект в качестве ссылки COM, VS отклоняет его, потому что он был создан как .NET dll.

Я пытался создать VB-скрипт для запуска CreateObject, но с ошибками в разрешениях. Я пытался настроить учетную запись I_USER и т. Д., Но я не смог этого сделать.

В реестре отображается запись с правильным именем, а для идентификатора класса установлено правильное значение guid. Но все же я хочу загрузить его и запустить через интерфейс COM.

Как проверить, что COM .dll на самом деле является COM .dll? Сколько бы лет ни было, должен быть способ.

1 Ответ

0 голосов
/ 28 июня 2019

Одним из быстрых способов сделать это является использование динамической функции .NET, которая очень полезна для программирования COM

Так что, если ваш класс определяется следующим образом (я лично не использую COM-интерфейсы с .NET, но это ничего не меняет, если интерфейс двойной), обратите внимание, что я добавил progid, который является хорошей практикой COM:

[Guid("0135bc5c-b248-444c-94b9-b0b4577f5a1a")]
[ProgId("MyComponent.TwoWay")]
[ComVisible(true)]
public class TwoWay
{
    public void Initialize(string IPAddress, long Port, long MaxPacketSize)
    {
        Console.WriteLine(IPAddress);
    }

    // other methods...
}

Затем я могу протестировать его с помощью .NET следующим образом (не нужно создавать TLB, просто зарегистрируйте его с помощью regasm):

var type = Type.GetTypeFromProgID("MyComponent.TwoWay");
dynamic twoway = Activator.CreateInstance(type);

twoway.Initialize("hello", 0, 0);

Неудобно, что у вас нет автозаполнения, вам просто нужно позаботиться о передаче подходящих аргументов. И .NET достаточно умен, чтобы конвертировать Int32 в Int64 (обратите внимание, что используемый вами C # long имеет ширину 64 бита).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...