Первый звонок CoCreateInstance
должен загружаться в процесс и инициализировать среду выполнения .NET. Затем ваша DLL должна быть загружена, «проверена» и скомпилирована в машинный код (хотя точно и вовремя помогает ускорить запуск). Время выполнения .NET также должно анализировать метаданные вашей сборки, а затем динамически генерировать и компилировать «COM-вызываемые обертки» (http://msdn.microsoft.com/en-us/library/f07c8z1c.aspx), которые являются прокси-серверами, которые соединяются между неуправляемым миром COM и управляемой средой .NET. Любые дополнительные библиотеки, которые могут использовать ваш код, также должны быть загружены, проверены и, возможно, скомпилированы в машинный код (если не NGEN'd).
Это по своей сути дорогостоящий процесс. Задержки, о которых вы говорите, не являются неслыханными.
Я не верю, что вы можете многое сделать, чтобы ускорить процесс. Я предлагаю вам подумать о том, можете ли вы принять удар в начале своей жизни, создав объект вскоре после запуска. Это не ускорится, но может значительно улучшить работу пользователя. если ваша программа просто не может терпеть задержки, то вы не должны использовать .NET для записи COM-объекта (более конкретно, вы не должны использовать .NET в своем процессе вообще. Это не проблема с использованием COM, это проблема с загрузкой .NET.)
Кстати, это одна из причин, почему написание расширений оболочки в .NET ... «сильно обескуражено». См. Недавнее сообщение на эту тему, в котором также рассказывается о производительности запуска .NET: http://blogs.msdn.com/b/oldnewthing/archive/2013/02/22/10396079.aspx
(Вот почему я спросил раньше, какого клиента вы запускали. Клиент, который уже запускает управляемый код .NET, зависит от время выполнения .NET и не повлияет на эти задержки)
Какой язык/окружающая среда ваш COM-клиент, написанный на? –
Что значит «второй раз»? Во второй раз, когда вы вызываете CoCreateInstance в том же процессе клиента? Или во второй раз, когда вы запускаете клиентское приложение, он идет намного быстрее? – selbie
@selbie отправить время в том же процессе клиента, если я перезапущу свой клиент, он снова имеет значительную задержку –