Информация об изменениях

Сообщение COM+ - двойной вызов конструктора от 05.09.2014 16:26

Изменено 05.09.2014 16:33 mDmitriy

Всем привет!

Win7 x64, VS 2012, NET 4.0, написан работающий COM+-объект (AnyCPU).
Вызываю с клиента (все на локальной машине, COM+-объект виден в "Службах компонентов"):
var clsid = new Guid("guid COM-объекта");
var type = Type.GetTypeFromCLSID(clsid, "localhost", true); // срабатывает только через localhost почему-то :???:
var instance = Activator.CreateInstance(type);

При этом некоторые методы COM+-объект, которые должны срабатывать по идее 1 раз, срабатывают два.
Примерный код сервера прилагаю:
[ObjectPooling(Enabled = true, MinPoolSize = 1, MaxPoolSize = 100, CreationTimeout = 10000)]
[ConstructionEnabled(Enabled = true, Default = "default")]
public class COMPlusObject : ServicedComponent, IProcessInitializer
{
    // методы расположены в порядке их вызова
    static COMPlusObject() {/*...*/}
    public COMPlusObject() {/*...*/}                                // при IProcessInitializer вызывается второй раз после Startup
    protected override void Construct(string s) {/*...*/ }          // при IProcessInitializer вызывается второй раз после второго COMPlusObject()
    protected override void Activate() {/*...*/}                    // при IProcessInitializer вызывается второй раз после второго Construct
    public void Startup(object punkProcessControl) {/*...*/}
    public override object InitializeLifetimeService() {/*...*/}    
    protected override void Deactivate() {/*...*/}                  // не отрабатывает вообще
    protected override bool CanBePooled() {/*...*/}                 // не вызывается
    public void Shutdown() {{/*...*/}                               
}

Если убрать IProcessInitializer, то все работает нормально, по одному разу...
В чем может быть дело?
Спасибо...
COM+ - двойной вызов конструктора
Всем привет!

Win7 x64, VS 2012, NET 4.0, написан работающий COM+-объект (AnyCPU).
Вызываю с клиента (все на локальной машине, COM+-объект виден в "Службах компонентов"):
var clsid = new Guid("guid COM-объекта");
var type = Type.GetTypeFromCLSID(clsid, "localhost", true); // срабатывает только через localhost почему-то :???:
var instance = Activator.CreateInstance(type);

При этом некоторые методы COM+-объект, которые должны срабатывать по идее 1 раз, срабатывают два.
Примерный код сервера прилагаю:
[ObjectPooling(Enabled = true, MinPoolSize = 1, MaxPoolSize = 100, CreationTimeout = 10000)]
[ConstructionEnabled(Enabled = true, Default = "default")]
public class COMPlusObject : ServicedComponent, IProcessInitializer
{
    // методы расположены в порядке их вызова
    static COMPlusObject() {/*...*/}
    public COMPlusObject() {/*...*/}                                // при IProcessInitializer вызывается второй раз после Startup
    protected override void Construct(string s) {/*...*/ }          // при IProcessInitializer вызывается второй раз после второго COMPlusObject()
    protected override void Activate() {/*...*/}                    // при IProcessInitializer вызывается второй раз после второго Construct
    public void Startup(object punkProcessControl) {/*...*/}
    public override object InitializeLifetimeService() {/*...*/}    
    protected override void Deactivate() {/*...*/}                  // не отрабатывает вообще
    protected override bool CanBePooled() {/*...*/}                 // не вызывается
    public void Shutdown() {{/*...*/}                               
}

Происходит это только при первом вызове объекта после запуска COM+-сервиса, при перезапуске повторяется.

Если убрать IProcessInitializer, то все работает нормально, по одному разу...
В чем может быть дело?
Спасибо...