Попытка зарегистрировать пакет на 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