Может ли компонент 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 он игнорирует корневой путь манифеста.

Я надеюсь, что это поможет кому-то в будущем.

Другие вопросы по тегам