Смешивание Кода C# и umanaged C++ кодирует в Windows с Visual Studio

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

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

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 ");
        }
    }
}
6
задан 3 revs 16 September 2008 в 20:38
поделиться

8 ответов

Этот вопрос слишком широк. Единственный разумный ответ является P/Invoke, но это отчасти похоже на высказывание, что, если Вы хотите программировать для Windows, необходимо знать API Win32.

В значительной степени все книги были записаны о P/Invoke (http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X), и конечно все веб-сайты были сделаны: http://www.pinvoke.net/.

1
ответ дан 17 December 2019 в 02:35
поделиться

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

Другой маршрут для движения, имеют неуправляемый C++, реализуют COM-классы и имеют C#, используют его через автоматически сгенерированный interop блок. Этот путь легче, если Вы знаете свой путь вокруг COM достаточно хорошо.

Надеюсь, это поможет.

3
ответ дан 17 December 2019 в 02:35
поделиться

Вы описываете P/Invoke. Это означает, что Ваша библиотека C++ должна будет выставить себя через интерфейс DLL, и интерфейс должен будет быть достаточно прост описать к P/Invoke через атрибуты вызова. Когда вызовы управляемого кода в неуправляемый мир, параметры должны быть упорядочены, таким образом, кажется, что мог быть небольшой хит производительности, но необходимо будет сделать некоторое тестирование, чтобы видеть, является ли маршалинг значительным или нет.

1
ответ дан 17 December 2019 в 02:35
поделиться

Можно также звонить в неуправляемый код через P/Invoke. Это может быть легче, если Ваш код в настоящее время не использует COM. Я предполагаю, что необходимо было бы, вероятно, записать некоторые определенные точки экспорта в коде с помощью "C" привязку, если бы Вы пошли этим путем.

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

0
ответ дан 17 December 2019 в 02:35
поделиться

Если Вы хотите пользу примеры PInvoke, можно посмотреть на PInvoke.net. Это имеет примеры того, как вызвать большинство функций API победы.

Также можно использовать инструмент из этой статьи Clr Inside Out: PInvoke, который переведет Ваш.h файл в c# обертки.

0
ответ дан 17 December 2019 в 02:35
поделиться

Я смотрел бы на большой глоток, мы используем это успешно на нашем проекте выставить наш API C++ другим платформам языка.

Это - хорошо сохраняемый проект, который эффективно создает тонкую обертку вокруг Вашей библиотеки C++, которая может позволить языкам, таким как C# связываться непосредственно с Вашим собственным кодом - избавление от необходимости, Вы иметь для реализации (и отладка) склеиваете код.

0
ответ дан 17 December 2019 в 02:35
поделиться

Конечно, всегда существует PInvoke там также при упаковке кода как DLLs с внешним entrypoints. Ни одна из опций не свободная боль. Они зависят или от a) Ваш навык при записи COM или от Управляемых оберток C b) риск Вашей рукой в PInvoke.

0
ответ дан 17 December 2019 в 02:35
поделиться

Самый легкий способ запуститься состоит в том, чтобы удостовериться, что вся функциональность C++ выставляется как функции стиля 'C'. Удостоверьтесь, что объявили функцию как _stdcall.

экстерн "C" __ declspec (dllexport) интервал _stdcall Foo (интервал a)

Удостоверьтесь, что Вы разбираетесь в маршалинге, особенно вещи как указатели и wchar_t *. Если Вы понимаете его превратно, может быть трудно отладить.

Отладьте его с любой стороны, но не обоих. При отладке смешанного собственного компонента и управляемый, отладчик может стать очень медленным. Отладка 1 стороны за один раз экономит много времени.

Более конкретное получение потребовало бы более конкретного вопроса.

1
ответ дан 17 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

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