Попытка зарегистрировать пакет на COM

Я использую regasm зарегистрировать мой .dll (происходит от .cs ниже) для Windows COM. Он возвращает предупреждение о том, что не было зарегистрированного типа. Я думал, что это потому, что не все мои зависимости имели конструкторы по умолчанию; но после смены я получаю ту же проблему. Мой вопрос заключается в том, нужно ли мне что-либо определять в моих классах, явно заявляя, что это будет использоваться как COM-объект? Если нет, то где я иду не так?

Вот минимальное подмножество одного из классов (основного):

public class AlmREST
{
    //State:
    private String server;
    private String domain;
    private String project;
    private String username;
    private String password;
    //
    private String system;
    //
    private String assignedTo;
    private String responsible;
    private String phase;
    private String testEnv;
    //
    private String sID;

    //client/session state: 
    private HttpClient client;
    private CookieContainer cookieJar;
    private HttpRequestHeaders mainHeaders;
    //
    private Cookie LWSSOkey;
    private Cookie QCsession;
    private Cookie sessionKey;
    private Cookie XSRFtoken;
    private Cookie almUser;

    //DEFAULT\/
    public AlmREST()
    {
        sID = Environment.MachineName;
    }

    public AlmREST(String[] authent, String sys, String[] tester)
    {
        server = authent[0];
        domain = authent[1];
        project = authent[2];
        username = authent[3];
        password = authent[4];

        system = sys;

        assignedTo = tester[0];
        phase = tester[1];
        testEnv = tester[2];

        responsible = username;
        schrodID = Environment.MachineName;

        startUp();
    }

    //For COM/JNI
    public void setup(string s, string d, string pr, string u, string p)
    {
        server = s;
        domain = d;
        project = pr;
        username = u;
        password = p;
        startUp();
    }

    private void startUp()
    {
        //@TODO(later): find out how to derive SSL-cert for HTTPS
        //handler.Credentials = getSSLCert();
        cookieJar = new CookieContainer();

        HttpClientHandler handler = new HttpClientHandler();
        handler.CookieContainer = cookieJar;
        client = new HttpClient(handler);
        client.BaseAddress = new Uri(server);
        mainHeaders = client.DefaultRequestHeaders;
        //erase headers
        mainHeaders.Clear();
    }

    //Lots of methods (omitted)

    //Delegates\/ could they be a problem?
    internal delegate Entity Factory(String entitiesType, params KeyValuePair<String, object>[] definition);
    internal delegate Entities SubTypeQuery(String subTypes, params KeyValuePair<String, object>[] values);
    internal delegate Entity Extractor(String field, object value, Entities entities);
    internal delegate bool LockSelf(String id, String entitiesType);
    internal delegate bool UnlockSelf(String id, String entitiesType);
    internal delegate bool DeleteSelf(String id, String entitesType);
    internal delegate bool AmmendProperty(String id, String entitiesType, params KeyValuePair<String, object>[] ammendments);
    internal delegate List<Delegate> Inheritor();
}

Теперь вызов методов из объектной модели, которую я определил, и у ВСЕХ этих классов также есть конструкторы по умолчанию. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, я пропустил методы, потому что их более 20. Благодарю.

1 ответ

Решение

Я думаю, что проблема в вашем классе. В соответствии с примером класса COM из MSDN. Класс должен следовать некоторым правилам, чтобы быть видимым для COM:

Чтобы открыть объекты Visual C# для COM, необходимо объявить интерфейс класса, интерфейс событий, если это необходимо, и сам класс. Члены класса должны следовать этим правилам, чтобы быть видимыми для COM: + Класс должен быть общедоступным.

  • Свойства, методы и события должны быть открытыми.
  • Свойства и методы должны быть объявлены в интерфейсе класса.
  • События должны быть объявлены в интерфейсе событий.

Другие открытые члены в классе, которые не объявлены в этих интерфейсах, не будут видны COM, но они будут видны другим объектам.NET Framework.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/example-com-class

Другие вопросы по тегам