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
}
Этот подход даст вам только доступные сборки в изолированной среде. Но это дает вам отправную точку в том, как получить доступ к "материалу", которого вы не должны.