JEP 259 предоставляет эффективный стандартный API для обхода стека, который обеспечивает легкую фильтрацию и медленный доступ к информации в стеке следы. До API Stack-Walking распространенными способами доступа к фреймам стека были:
Throwable::getStackTrace
иThread::getStackTrace
возвращать массив объектовStackTraceElement
, которые содержат имя класса и имя метода каждого стека элемент трассировки.
SecurityManager::getClassContext
- это защищенный метод, который позволяет подклассуSecurityManager
обращаться к контексту класса.JDK-внутренний метод
sun.reflect.Reflection::getCallerClass
, который вы не должны использовать в любом случае
Использование этих API-интерфейсов обычно неэффективно:
Для этих API требуется виртуальная машина чтобы охотно захватить снимок всего стека , и они возвращают информацию, представляющую весь стек. Невозможно избежать затрат на проверку всех кадров, если вызывающий абонент интересуется только несколькими верхними кадрами в стеке.
Чтобы найти класс непосредственного абонента, сначала получите StackWalker
:
StackWalker walker = StackWalker
.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
Затем либо вызовите getCallerClass()
:
Class> callerClass = walker.getCallerClass();
или walk
StackFrame
и получить первое предшествующее StackFrame
:
walker.walk(frames -> frames
.map(StackWalker.StackFrame::getDeclaringClass)
.skip(1)
.findFirst());
Между «идентификацией сборки» и установкой архитектуры процессора на MSIL кажется, что вы говорите ему, что точка входа находится в какой-то сборке .NET.
К сожалению, беглый поиск показал, что вы невозможно развернуть неуправляемое / собственное приложение с помощью clickonce. Точкой входа необходимо управлять.
Вы можете создать прокладку, как описано здесь .
Приложением нужно управлять. ClickOnce использует систему безопасности, встроенную в среду CLR, для ограничения возможностей приложения. В собственном коде ничего подобного нет.