Встраивание блоков в другом блоке

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
41
задан Peter Mortensen 15 January 2010 в 19:36
поделиться

5 ответов

Смотрите на телефон ILMerge для слияния блоков.

я также немного смущен тем, почему блоки.NET являются .dll файлами. Разве этот формат не существовал перед.NET?

Да.

все блоки.NET DLLs,

Или DLLs или EXE обычно - но может также быть netmodule.

, но не весь DLLs блоки.NET?

Корректный.

, Почему они используют тот же формат файла и/или расширение файла?

, Почему должен он несколько отличаться - это служит той же цели!

35
ответ дан Anthony 27 November 2019 в 00:18
поделиться

ILMerge действительно объединяет блоки, который хорош, но иногда не совсем, что Вы хотите. Например, когда рассматриваемый блок является сборкой со строгим именем, и у Вас нет ключа для него, тогда Вы не можете сделать ILMerge, не повреждая ту подпись. Что означает, что необходимо развернуть несколько блоков.

Как альтернатива ilmerge, можно встроить один или несколько блоков как ресурсы в exe или DLL. Затем во времени выполнения, когда блоки загружаются, можно извлечь встроенный блок программно, и загрузить и выполнить его. Это звучит хитрым, но существует только определенный шаблонный код.

, Чтобы сделать это, встройте блок, как Вы встроили бы любой другой ресурс (изображение, файл перевода, данные, и т.д.). Затем создайте AssemblyResolver, в который заходят время выполнения. Это должно быть настроено в статическом конструкторе класса запуска. Код очень прост.

    static NameOfStartupClassHere()
    {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver);
    }

    static System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args)
    {
        Assembly a1 = Assembly.GetExecutingAssembly();
        Stream s = a1.GetManifestResourceStream(args.Name);
        byte[] block = new byte[s.Length];
        s.Read(block, 0, block.Length);
        Assembly a2 = Assembly.Load(block);
        return a2;
    }

свойство Name на параметре ResolveEventArgs является названием блока, который будет разрешен. Это имя относится к ресурсу, не к имени файла. Если Вы встраиваете файл под названием "MyAssembly.dll" и называете встроенный ресурс "Нечто", то именем, которое Вы хотите здесь, является "Нечто". Но это сбивало бы с толку, таким образом, я предлагаю использовать имя файла блока для названия ресурса. Если Вы встроили и назвали свой блок правильно, можно просто назвать GetManifestResourceStream () с именем сборки и загрузить блок тот путь. Очень простой.

Это работает с несколькими блоками, так же приятно как с единственным встроенным блоком.

В реальном приложении Вы собираетесь хотеть лучшую обработку ошибок в той стандартной программе - как какой, если нет никакого потока именем? Что происходит, если Read перестал работать? и т.д., Но это уехало в Вас, чтобы сделать.

В остальной части кода приложения, Вы используете типы от блока как нормальные.

при создании приложения необходимо добавить ссылку на рассматриваемый блок, как Вы обычно были бы. При использовании инструментов командной строки используйте/r опцию в csc.exe; при использовании Visual Studio Вам будет нужно к тому, "Добавьте Ссылка..." во всплывающем меню на проекте.

Во времени выполнения, проверке версии блока и проверке работает, как обычно.

единственная разница находится в распределении. Когда Вы развертываете или распределяете свое приложение, Вы не должны распределять DLL для встроенного (и ссылаемый) блок. Просто разверните основной блок; нет никакой потребности распределить другие блоки, потому что они встраиваются в основной DLL или EXE.

56
ответ дан Cheeso 27 November 2019 в 00:18
поделиться

Вы можете встраивать блок (или любой файл, на самом деле) как ресурс (и затем используйте ResourceManager класс для доступа к ним), но если Вы просто хотите объединить блоки, Вы - более обеспеченное использование инструмента как ILMerge.

EXE и файлы DLL Windows портативные исполняемые файлы , которые достаточно универсальны для размещения будущих типов кода, включая любой код.NET (они могут также работать в DOS, но только отобразить сообщение, говоря, что они, как предполагается, не работают в DOS). Они включают инструкции разжечь время выполнения.NET, если оно уже не работает. Для единственного блока также возможно охватить через несколько файлов, хотя это почти никогда не имеет место.

7
ответ дан Mark Cidade 27 November 2019 в 00:18
поделиться

Существует также mkbundle утилита, предлагаемая Моно проект

4
ответ дан hova 27 November 2019 в 00:18
поделиться

Примечание. ILMerge не работает со встроенными ресурсами, такими как XAML, поэтому приложениям WPF и т. Д. Необходимо использовать метод Cheeso.

5
ответ дан 27 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: