Всё более менее значимое рождается на стыке технологий. Не достаточно обладать знаниями только в одной области, чтобы перестать быть винтиком в большом механизме разработки ПО. Если вы хотите сделать что-то, что заметят, и что сможет повторить не каждый, то самый верный путь – комбинировать подходы из разных областей знаний, и чем неожиданнее, тем может получиться удачнее. Или наоборот…
Собственно, для начала достаточно всего лишь знать – с чего начинать и в каком направлении двигаться, и дальше само пойдет.
Я вспоминаю, как много раз откладывал изучение нового языка и платформы, потому что их тутор оказывался слишком уж правильным и полным. А хочется, прочитав пару страниц, все понять и начать что-то писать. Поэтому, я не буду строго придерживаться установленных определений, я даже не гарантирую, что мое изложение материала правильное. Но я гарантирую, что, прочитав все до конца, вы напишите свою первую программу на C#, причем, в обычном блокноте, и не просто программу, а полнофункциональный com-сервер, который сможете затем запустить из под 1С…
И так, для работы нам потребуются:
- Блокнот. Т.е., программа NotePad, кто еще не понял (кто сейчас задумался, где её взять – ставим минус к этой статье!)
- .Net Framework 2.0 или выше (в состав его уже входит компилятор c#)
Обычно фреймворк тот или иной у большинства юзеров на компьютере уже имеется, поэтому ничего устанавливать не придется. Для софт меньшинств – ссылка:
Для начала работы с C# про него нужно знать несколько фактов:
1. Это объектно-ориентированный язык, а значит, объект и станет главным понятием при программировании на нем. Иными словами, вся программа – это определение какого-то объекта, в состав которого входят другие объекты, в состав которых входят третьи, и т.д.
Выглядит это так:
namespace Work
{
class Program
{
…
class MyClass1
{
…
}
…
class MyClass2
{
…
}
…
}
}
2. C# — это просто еще один язык программирования, и без огромного набора объектов из библиотеки .Net Framework, которые можно очень легко подключать и использовать, C# был бы практически не интересен.
Для подключения чего-то из библиотек .Net мы просто добавляем в начало нашей программы определение пространства имен (namespase), где в .Net это что-то лежит:
using System;
using System.IO;
using Directory;
И т.д.
Конечно, нужно знать, где и что в библиотеках .Net лежит. Для этого пользуем справочники по >net Framework и свой накопленный в процессе опыт.
Чем отличается объект от переменной, думаю, объяснять не нужно. Когда мы создаем переменную, то просто резервируем под нее память, чтобы что-то туда записать.
А = 2012;
Когда мы определяем объект, то привязываем к «переменной» еще и методы, как с данными, что в ней хранятся, работать.
А.УстановитьГод(2012);
Т.е., объект – это логически оправданное объединение данных (кучи переменных, или полей, или еще говорят — свойств) и методов работы с ними (при этом, все свойства объекта по определению видны в его методах).
И так, у нас C# есть, блокнот есть, с объектами мы определились, пора уже что-нибудь написать…
Мы будем использовать вывод информации в консоль (т.е., не в windows-окно). Объект Console, связанный с таким выводом на экран, находится в библиотеках .Net в пространстве имен System. Т.е., первая строка нашей программы должна сделать доступным это пространство имен. И, собственно, нам потребуется только один метод объекта Console, а именно Write().
using System;
namespace Work
{
public class Program
{
static void Main() // основная рабочая функция
{
Console.Write(«Hello, world!»); // Пишем
Console.ReadLine(); // Ждем нажатия Enter
}
}
}
Это должно у нас получиться в блокноте. Сохраняем в myprogram.cs. Компилируем с помощью компилятора c#
csc.exe myprogram.cs
Если не запустилось, то ищем csc.exe. Обычно оно лежит в C:WINDOWSMicrosoft.NETFramework v3.5 Для простоты можно скопировать наш файл туда и там выполнить компиляцию. (Увернулся от летящего помидора…)
Запускаем в режиме эмуляции DOS. Радуемся жизни.
Все то же самое, но пробуем создать и использовать свой класс:
namespace Work
{
public class Program
{
static void Main() // основная рабочая функция
{
AClass A=new AClass(); // Создаем экземпляр своего класса
A.Greeting(«Олег»); // Обращаемся к его методу
}
private class AClass // Определяем наш класс
{
public void Greeting(string Name) // Определяем его метод Greeting
{
Console.Write(«Hello,»+Name); // Пишем
Console.ReadLine(); // Ждем нажатия Enter
}
}
}
}
DLL – это динамическая библиотека функций и объектов, которые можно использовать в других программах.
В нашей DLL мы определяем некий метод, который хотим использовать для суммирования двух чисел. При этом, результат хотим сохранить внутри нашего DLL, и когда нужно- восстановить.
using System.Runtime.InteropServices;
namespace Work
{
public interface MyInterface // Интерфейс нашей библиотеки
{
int Summa(int a, int b); // В нашем распоряжении – два метода. Тут мы их просто опишем
int Memory();
}
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Server: MyInterface // Класс – потомок интерфейса.
// Значит, он должен содержать методы, описанные в интерфейсе
{
int buf;
public int Summa(int a, int b) // А тут мы определяем описанные в интерфейсе методы
{
int res=a+b;
buf=res;
return res;
}
public int Memory()
{
return buf;
}
}
}
Ничего сложного. Язык интуитивно понятен.
Правда, теперь команда компиляции будет несколько иной:
csc.exe arget:library myprogram.cs
Появилась myprogram.dll. Регистрируем ее в системном реестре.
regasm myprogram.dll /cosebase
Если кому интересно, что такое это регасм – отвечу: это нечто, что наш dll делает видимым для других программ. Кому такого объяснения мало – прыгаем сюда и читаем много всего о regasm
Hello, 1С #
На самом деле, мы только что создали свой первый com-сервер на c#. Осталось проверить, как он работает в 1С.
Открываем конфигуратор, создаем внешнюю обработку и по нажатию клавиши выполняем:
Объект=Новый COMОбъект(“Work.Server”);
Сообщить(Объект.Summa(2,3));
Сообщить(Объект.Memory());
Проверяем, пляшем.
Практическое применение com-технологий одинэсник может найти, например, в защите своих авторских прав. Как в прошлом примере мы передавали на вход нашего метода «Summa» числа, так я могу, например, передать объект «Запрос», инициализировать и выполнить его внутри dll, потом стереть текст запроса и возвратить только результат.
Таким образом, пользователь не увидит, что делает мой запрос, и без моей dll программа работать не будет. Осталось добавить некий подсчет числа запусков, или контроль даты запуска, и вот вам защита триал-версии!
Конечно, если в запросе пара очевидных строк, то метод этот не слишком защитит. Но если в вашей конфигурации несколько десятков запросов в полсотни строк каждый, то защита будет вполне надежной.
Этот метод защиты ООО «О-Планет» давно и успешно использует в наших коммерческих решениях под «восьмерку», и при желании мы готовы бесплатно поделиться нашими наработками. 😉
Поражает то, что с каждым разом видишь все больше и больше заказов сделать что-то на .Net с помощью VC#. Кажется, мелкомягкие на этот раз постарались: платформа получилась для разработчика проще, чем конфигуратор 1С, намного проще, чем Delphi а с учетом того, что это все-таки и С, и полноценное ООП – еще и продвинутее их обоих. К тому же, имеется бесплатные полнофункциональные версии ПО. А значит, и стоимость конечного продукта не зависит от числа приобретенных платформ, что очень радует.
На месте разрабов 1С я бы версию 1С:Предприятие 9 сделал ни как отдельную платформу, а как библиотеку классов для Microsoft Visual C#. Не 1С, так кто-то другой однажды такое сделает, и у 1С определенно настанут сложные времена…
а чо за барышня?
(1) Дык там же написано! «Коллега, которая дала quick start» 🙂
Я б тоже не против приватного программирования с такой коллегой 😉
Супер! exe и dll получаются по 3 килобайта вообще!!! Отличный старт к написанию маленьких и мобильных вирусов для юных хаЦкеров! Причём ещё и из под 1С… 😉
Только ошибка при создании библиотеки. Слеш в другую сторону нужно делать.
>csc.exe arget:library myprogram.cs
Должно быть так: csc.exe /target:library myprogram.cs
(5) Спасибо. Вот только как исправить? Сейчас исправишь — статья исчезнет. На модерации потому что будет. А сейчас выходные…
Для quick start статья зачетная!
отличная статья)
(9) Ну наконец-то! Наконец-то хто-то появился и написал, как все должно быть правильно и корректно. Что ж, грустно приготовился все переделывать. Обложился вумными книгами в 100500 страниц… Пожалуй, начну с того в новой редакции этой статьи, что с# нельзя назвать чистым ООП, потому что он не поддерживает множественное наследование. Хотя #-кодеры (читать «шарп», а не «быдло») с этим конечно не согласятся. Они уверены, что интерфейсы решают все. Оставим это заблуждение на их совести и напомним о моих любимых template, без которых по мне, так и плечу не раззудиться в волю… А где память??? Дайте мне работать с памятью!!! Дайте alloc! Дайте
for( ; *src!=’