Assembly.GetExecutingAssembly не существует в PCL

Я установил PCL в VB, VS2012 и установил его для профиля 78 (WinRT, WinPhone8,.NET 4.5). У меня нет GetExecutingAssembly в Assembly. Согласно этому, он должен быть доступен для PCL. Единственный доступный метод - Assembly.Load().

Кто-нибудь, что я должен делать с этим? Например. это правда, моя среда прикручена, есть ли другой способ доступа к GetExecutingAssembly кроме Imports System.Reflection? Любые другие идеи?

Ответы

Ответ 1

В общем, вы должны использовать что-то вроде typeof(MyType).GetTypeInfo().Assembly вместо Assembly.GetExecutingAssembly(). GetExecutingAssembly должен в основном исследовать стек вызовов, чтобы выяснить, какой метод его вызывает, а затем просмотреть соответствующую сборку. Это может сломаться, если методы всегда привязаны к границам сборки, поэтому метод GetExecutingAssembly не находится в "новой" области поверхности отражения, которую использует Profile 78 (а также .NET для приложений Windows Store).

Ответ 2

Разделение выполняется очень глубоко и довольно тщательно в ПЛК.

Здесь важно понять, что Portable Class Library/PLC в качестве профиля платформы не существует. Запустившееся приложение не будет нести те же ограничения, что и компилятор, при компиляции вашего проекта ПЛК.

Вот один из способов преодолеть барьер:

using System;
...
try {
    var getExecutingAssembly = typeof(Assembly).GetRuntimeMethods()
                                .Where(m => m.Name.Equals("GetExecutingAssembly"))
                                .FirstOrDefault();
    var assemblies = getExecutingAssembly.Invoke(null, null);
} catch(Exception exc){
   ... try something else
} finally{
   ... time for some alternative 
}

Этот подход даст вам только доступные сборки в изолированной среде. Но это дает вам отправную точку в том, как получить доступ к "материалу", которого вы не должны.