C # 4.0. Объединить сборку .dll с .NET - PullRequest
4 голосов
/ 09 января 2011

Я решил оставить свой другой вопрос , чтобы умереть, поскольку я подумал о новой идее, использующей метод Джеффри Рихтера, написанный на этой странице , для объединения библиотеки .dll с моим приложением. Поэтому я добавил свой файл .dll как встроенный ресурс, а также добавил его в качестве ссылки. Затем в Program.cs (я понятия не имею, куда должен идти код, который он разместил), я добавил это:

    ...
    [STAThread]
    static void Main()
    {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            string[] args = Environment.GetCommandLineArgs();
            if (args.Length > 1)
                _in = args[1];
            SingleInstanceController controller = new SingleInstanceController();
            controller.Run(args);

            AppDomain.CurrentDomain.AssemblyResolve += (sender, argsx) =>
{
String resourceName = "AssemblyLoadingAndReflection." +
   new AssemblyName(argsx.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
    Byte[] assemblyData = new Byte[stream.Length];
    stream.Read(assemblyData, 0, assemblyData.Length);
    return Assembly.Load(assemblyData);
    }
}
        ;

Должен ли я изменить resourceName на что-то другое? Правильно ли я добавил (в нужном месте)?

Теперь проблема в том, что по-прежнему не удается найти и загрузить сборку, и я не уверен, что сделал неправильно. Любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 09 января 2011

Ваша проблема очень похожа на эту: C #: Как встроить DLL в файл ресурсов (без копирования dll в программном каталоге)

По сути, ваш обработчик событий AppDomain.AssemblyResolve не был вызван, потому что Main не удалось скомпилировать. Даже если он скомпилирован, присоединение обработчика событий должно быть первым, что вы делаете в main.

Мой ответ на вопрос выше содержит пример рабочего кода и объяснение, почему ваш код не работает.

2 голосов
/ 09 января 2011

Используйте отладчик. Установите точки останова в назначении AssemblyResolve и в лямбда-теле. Один шаг код.

Да, уже слишком поздно. Переместить задание. Если SingleInstanceController находится в такой DLL, то метод Main () даже не запускается. Переместите этот код в отдельный вспомогательный метод и присвойте ему атрибут [MethodImpl (MethodImplOptions.Noinlining)].

Распространение вашей программы в одном файле уже очень хорошо поддерживается, не требует ни кода, ни слияния DLL. Также заботится о ярлыках на рабочем столе, об ассоциации файлов и установке .NET на старые машины. Это называется setup.exe

1 голос
/ 09 января 2011

Подключите событие AssemblyResolve, прежде чем AppDomain попытается разрешить ссылки, т. Е. В точке входа и в первой строке.

Имя встроенного ресурса начинается с имени приложения, за которым следует имя ресурса.например: ConsoleApplication.Test.dll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...