Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Неуправляемое программирование на C#


Автор: nginx 18.10.2009, 00:18
Добрый день,

Меня беспокоит след. проблема:

В C# существует возможность использования неуправляемого кода ( unmanaged code ), и данная возможность предоставленна для совмещения управляемого и неуправляемого кода.

К примеру, насколько я понял, Silverlight написан на C++/C# ( да и многое другое, что есть в дотНЕТе ), как раз, в данном случае, группа разработчиков, которая занимается разработкой Silverlight использует данный прием.

Хотелось бы узнать на практике, на самом банальном примере, как можно сделать совместную работу unmaned С++/C# ( если мы не Viusal C++ ( C++\CLI ), а к примеру GCC-комплиятор используем ).

Если честно немного не понимаю, как это можно совместить. Просьба не ругать меня, я только учусь и хочу просто вникуть в теорию =)

Ну давайте, приведем простейший код с неуправляемым кодом на C#:

Код

using System;

class program
{
    //Отмечаем метод Main() , как опасный
    unsafe public static int Main()
    {
        int a = 15;

        int* b; //Создаем указатель на int-значение
        
        b = &a; //Поместили адрес переменной a в указатель b

        Console.WriteLine("Начальное значение переменной a: " + *b); //Выведет 15

        *b = 9;

        Console.WriteLine("Новое значение переменной a равно: " + *b); //Выведет 9

        return 0;    

    }
}


Скомпилируем с опцией /unsafe.

Указатель - это переменная, которая хранит адрес других переменных.

Вернемься, к C++/C#, допустим в C++ я создал перменную (int)z , и задам ей значение 100.
Пропущу через, GCC С++ программу, которая выводит значение этой переменной.

Как я могу получить адрес данной переменной, и взять ее значение в  С# и вывести через Console.WriteLine(); ?
Или взять адрес переменной в программе, под управлением CLR , и использовать в С++ программе ( которую скомпилировал, не из Visual C++ ).

PS: просьба не ругать =) только учусь и познаю программирование еще много не знаю, просьба , если написал глупость нормально разобъяснить

Заранее спасибо,
Олег

Автор: PashaPash 18.10.2009, 01:21
nginx, слишком много пытаешься охватить.
Вызов методов которые где-то написаны на C++ из C# - это не "неуправлемое программирование", это просто взаимодействие с неуправляемым кодом, для которого есть куча классов в System.Runtime.InteropServices. 
Решение твоей задачи:
1. Найди как создать dll на C++/GCC
2. Сделай в этой dll экспортируемый (dllexport) метод, который вернет значение, гм, переменной
3. Найди как в C# (из управляемого кода) вызывать методы из неуправляемой dll (посмотри DllImportAttibute)

Автор: nginx 18.10.2009, 01:32
Спасибо за качественный ответ! =)
Буду работать над этим, о результатах расскажу позже =)


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)