Многократный поиск dll с COM-классом
От: mDmitriy Россия  
Дата: 21.11.14 12:16
Оценка: :)
Всем привет!

Есть работающий COM+-компонент на C# .NET 4.0...

На клиенте объект COM-класса получается стандартно:
var clsid = new GUID("{ guid зарегистрированного com-класса  }")
var type = Type.GetTypeFromCLSID(clsid, host, true);
var instance = (IMyInterface)Activator.CreateInstance(type);

Далее при любом обращении к свойствам или методам instance (указанным в IMyInterface) в обработчике AppDomain.CurrentDomain.FirstChanceException вываливается исключение (в основном коде не проявляется):

Не удалось загрузить файл или сборку "COMPlus.Component, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ccfd32d01ad1fcb9" либо одну из их зависимостей. Не удается найти указанный файл.
System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "COMPlus.Component, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ccfd32d01ad1fcb9" либо одну из их зависимостей. Не удается найти указанный файл.
Имя файла: 'COMPlus.Component, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ccfd32d01ad1fcb9'
в System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)

Предупреждение: регистрация привязки сборок выключена.
Чтобы включить регистрацию ошибок привязки сборок, установите значение параметра реестра [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) в 1.
Примечание. Регистрация ошибок привязки сборок может привести к некоторому снижению производительности.
Чтобы отключить эту функцию, удалите параметр реестра [HKLM\Software\Microsoft\Fusion!EnableLog].

Не удалось найти сборку "COMPlus.Component, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ccfd32d01ad1fcb9".
System.Runtime.Serialization.SerializationException: Не удалось найти сборку "COMPlus.Component, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ccfd32d01ad1fcb9".
в System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()

AppDomain.CurrentDomain.AssemblyResolve тоже отрабатывает соответственно.
При этом все свойства COM-класса доступны, методы выполняются нормально.

Вопрос: как убрать этот многократный поиск dll (и всегда неудачный, ибо она находится на сервере)?
Если все работает, значит эта dll где-то в каком-то контексте проявляется на клиенте — может, ее как-то закешировать можно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.