Может ли компонент SilverLight создавать не требующий регистрации COM-видимый объект.NET
Мы пытаемся загрузить в SilverLight 5.0 компонент, работающий в IE, видимый COM-объект.NET без регистрации с помощью API контекста активации. http://msdn.microsoft.com/en-us/library/ms973913.aspx
Компонент SilverLight работает в браузере как доверенное приложение, как описано в http://msdn.microsoft.com/en-us/library/gg192793(v=vs.95).aspx.
Объект может быть загружен в отдельное тестовое приложение с использованием API контекста активации, чтобы манифест был правильно сформирован. In SiverLight running inside the browser, the component loader DLL (loaded from AppData/LocalLow) creates and activates the activation context successfully but fails to load the COM-visible.NET object DLL from the AppData/LocalLow. The result is always "the file could not be found".
Does anyone have experience with SilverLight/COM in similar setup?
ТИА
1 ответ
Я подал заявку в Microsoft, и предлагаемое решение является обходным путем для фактической ошибки в контексте активации.
//Create your own activation context pointing to the manifest
ACTCTX actCtx;
ULONG_PTR pCtxCookie;
//initialize actCtx with your manifest name and path
....
HANDLE hActCtx = CreateActCtx(&actCtx);
ActivateActCtx(hActCtx, &pCtxCookie);
....
//surround EVERY CALL to CreateInstance with the null activation context, otherwise you will get an error on DeactivateActCtx!!!
ULONG_PTR cookie; //do not reuse the pCtxCookie!!!
ActivateActCtx(NULL, &cookie);
HRESULT hr = classA.CreateInstance(__uuidof(SxSNET::SxSClass));
DeactivateActCtx(0, cookie); //deactivate the null context
...
//deactivate and deallocate your actual manifest based activation context
DeactivateActCtx(0, pCtxCookie);
ReleaseActCtx(hActCtx);
Решение НЕ работает. Проблема с этим решением состоит в том, что нулевой контекст вызывает привязку к зарегистрированной версии сборки.NET, а не той, которая использует изолированный контекст. Существует ошибка в COM без регистрации при вызове сборок.NET из-за логики поиска привязки, которая вообще не ищет в расположении манифеста, а только в GAC и пути бинарного процесса.
По словам Microsoft:
Эта ошибка возникает из-за сбоя при проверке слияния для сборки.NET, где управляемый компонент COM определен и реализован. Среда выполнения.NET проверяет только файлы, относящиеся к пути, подлежащему обработке, или кэшу глобальной сборки. Для управляемого COM-взаимодействия Reg-Free он игнорирует корневой путь манифеста.
Я надеюсь, что это поможет кому-то в будущем.