Всё более менее значимое рождается на стыке технологий. Не достаточно обладать знаниями только в одной области, чтобы перестать быть винтиком в большом механизме разработки ПО. Если вы хотите сделать что-то, что заметят, и что сможет повторить не каждый, то самый верный путь – комбинировать подходы из разных областей знаний, и чем неожиданнее, тем может получиться удачнее. Или наоборот…
Собственно, для начала достаточно всего лишь знать – с чего начинать и в каком направлении двигаться, и дальше само пойдет.
Для закрепления материала я нашел заказик на c# для какого-то московского ночного клуба. Это дало необходимую практику, потому что учиться чему-то лучше тогда, когда это кто-то спонсирует, чего и всем желаю...
Я вспоминаю, как много раз откладывал изучение нового языка и платформы, потому что их тутор оказывался слишком уж правильным и полным. А хочется, прочитав пару страниц, все понять и начать что-то писать. Поэтому, я не буду строго придерживаться установленных определений, я даже не гарантирую, что мое изложение материала правильное. Но я гарантирую, что, прочитав все до конца, вы напишите свою первую программу на 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:\WINDOWS\Microsoft.NET\Framework\ 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 \target: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С определенно настанут сложные времена…