Как выполнить ассемблерный код при запуске приложения - PullRequest
2 голосов
/ 11 марта 2010

Я знаю, что этот вопрос похож на несколько предыдущих, но я не могу найти точного ответа. У меня есть прикладная среда, которая, помимо прочего, обрабатывает необработанные ошибки. На данный момент мне требуется, чтобы приложение хоста вызывало метод Register в методе приложения Main для регистрации обработчиков и различных подсистем. Мне бы очень хотелось избавиться от этой зависимости и заменить параметры метода Register некоторыми атрибутами уровня сборки. Итак, мне нужен способ определить, что хост-приложение запущено из моей сборки - как если бы оно было частью .NET Framework.

Я бы хотел избежать каких-либо явных вызовов внутри хост-приложения или каких-либо специальных строк в файле конфигурации (хотя они более приемлемы). Поэтому простое добавление ссылки на сборку приводит к инициализации компонентов при запуске приложения. Кто-нибудь придумал, как это сделать?

Чтобы прояснить ситуацию, вот пример моего идеала до и после сценариев:

// BEFORE:
[System.STAThread]
private static int Main(string[] args)
{
    SupportLibrary.Register(typeof(Program).Assembly, SupportLibrary.ApplicationType.WinForms);

    // Get the application initialised...
}

// AFTER:
[System.STAThread]
[SupportLibrary.ApplicationType(SupportLibrary.ApplicationType.WinForms)]
private static int Main(string[] args)
{
    // Get the application initialised...
}

Дело в том, что я хотел бы избавиться от явного вызова для регистрации библиотек поддержки и вместо этого зарегистрировать их неявно при запуске приложения и загрузке сборки поддержки.

Ответы [ 2 ]

4 голосов
/ 11 марта 2010

Итак, я нашел ответ. Это может быть неприменимо в каждом случае, но это работает для меня, потому что способ использования моей библиотеки означает, что она всегда загружается при запуске приложения. Спецификация CLR предусматривает определение инициализаторов модулей. Они называются при первом обращении к модулю (например, сборке) и перед выполнением какого-либо кода - это именно то, что я хочу. Нет прямого условия для их указания в C #, но эта статья:

http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp

предоставляет инструменты, необходимые для внедрения IL непосредственно в вашу сборку после компиляции (что работает для меня, потому что я не подписываю и не обфускирую свой код). Надеюсь, это кому-нибудь поможет.

0 голосов
/ 11 марта 2010

Самый простой способ сделать это - использовать файл конфигурации - просто добавьте пользовательский раздел, в который вы будете записывать все сборки, необходимые для инициализации. Затем ваше хост-приложение пройдет через этот список и вызовет метод Assembly.Load() для каждой из необходимых вам сборок. После этого вы можете выполнить любую необходимую инициализацию (методы маркировки, которые будут вызываться в сборках с пользовательскими атрибутами и т. Д.).

Я не уверен, есть ли способ (я думаю, что есть), чтобы загрузить все сборки приложения одновременно. Если вы можете найти такой способ, вы можете пометить все сборки, которые необходимо инициализировать, с помощью атрибута suctom, а затем просто просмотреть все загруженные сборки, загруженные (AppDomain.CurrentDomain.GetAssemblies()), чтобы отфильтровать их с вашим атрибутом.

...