A.R.I.S.E Logo
A.R.I.S.E | mono | projects | blog | about | links .
mono-Hack

Раздел с простыми примерами возможностей Mono

Вот простые примеры того, что Mono является действительно хорошей средой для разработчика

Mono

Serialization of byte[]

Original
06-04-2008

Serialization теперь полностью работает.
Ранее были различия в серриализации в Mono и .NET. Mono<->Mono работал но .NET<->Mono не работал. Все исправленно.

System.Windows.Forms большой финал.

Original
Tuesday, May 13, 2008

Сегодняшней ночью очень важная веха в в поддержке Winforms. API полностью сделан, ntgthm yfi API точно такой же как .NET (все 12,776 методов). Мы не говорим о потраченном вермени оглядываясь назад но первая проверка Winformas состоялась July 8th, 2004, на всю работу было потрачено 4 года. За это время сделанно 6,434 commit в Winforms. Спасибо всем кто помогал в этой работе! Спасибо всем тем кто делал contribute code! Спасибо всем кто делал contribute test! Спасибо всем кто делал contributed Bugzilla reports! Что дальше ? Необходимо проверять на ошибки код написанный для кросплатформенного windowing/widget приложения. Если вы заметели баг в вашем приложении то необходимо по возможности предоставить отчет суда

Все изменения будут доступны в Mono 2.0 Release.

Moma отчеты о совместимости с .NET 2.0



Для завершения работы над 2.0 необходимо пройти через Moma отчет для ADO.NET. Данный отчет является достаточным требованием в использовании 100% совместимого кода с .NET 2.0

Список
Todo APIs отображаемых Moma следующий :

285 System.Data.DataSet::.ctor(System.Runtime.Serialization.SerializationInfo,
System.Runtime.Serialization.StreamingContext,
System.Boolean)
81 System.Data.SqlClient.SqlConnection::set_ConnectionString(System.String)
42 System.Data.SqlClient.SqlConnection::get_ConnectionString()
11 System.Data.OracleClient.OracleParameter::set_Value(System.Object)
7 System.Data.OracleClient.OracleParameter::get_Value()
6 System.Data.OleDb.OleDbDataReader::GetFieldType(System.Int32)
5 System.Data.Common.DbDataAdapter::set_UpdateBatchSize(System.Int32)
5 System.Data.OracleClient.OracleDataReader::GetSchemaTable()
4 System.Data.OracleClient.OracleDataReader::NextResult()
2 System.Web.Handlers.TraceHandler::ShowDetails(System.Data.DataSet)
2 System.Data.OracleClient.OracleCommand::ExecuteOracleScalar()
2 System.Data.Common.DbDataAdapter::get_UpdateBatchSize()
1 System.Data.OracleClient.OracleConnection::get_DataSource()
1 System.Data.OracleClient.OracleCommand::Clone()
1 System.Data.OracleClient.OracleDataReader::GetOracleBinary(System.Int32)
1 System.Data.OleDb.OleDbConnection::GetSchema(System.String)

Несколько неделю ушло не реализацию данного API некоторые части
MSDN описывающие API не имеют пояснений и примеров использования. Типичный пример

System.Data.DataSet::.ctor(System.Runtime.Serialization.SerializationInfo,
System.Runtime.Serialization.StreamingContext,System.Boolean).

как вы видите
285 требований созданны для этого API.

Требуется помощь : примеры использования
.NET кода помогут в создании API. Пожалуйста присылайте дефекты в bugzilla.novell.com с добавлением примеров кода или коментариями с линком на на ваш пример использования. Или отправляйте примеры на vvaradhan AT novell DOT com. Пожалуйста не присылайте код который не соответствует MIT/X11шлицензии однако публичный код преветствуется (public domain code is accepted). Большое спасибо и продвижения.

Версия вашей сборки

Как посмотреть версию сборки? Все очень просто для Linux - используем дизасемблер и grep :

user# monodis --assembly Hello.exe | grep Version

Mono .NET 2.0 Compiller

Как скомпилировать файл под Mono .NET 2.0. Используйте компилятор gmcs :

user# gmcs MyClass.cs

Gtk

Регестрация свойств GObject.

Original.

Поддержка свйоств GObject появилась в управляющих классах. Эти свойства необходимы специально для людей использующих Custom CellRenderers.В текущем патче есть метод CellDataFunc который необходимо использовать для custom cell render в место того чтобы использовать SetAttributes механизм уязвимый для Gtk. Простой пример сипользования от автора :

// PropertyRegistration.cs - GObject property registration sample
//
// Author: Mike Kestner 
//
// Copyright (c) 2008 Novell, Inc.

namespace GtkSamples {

	using System;

	public class TestObject : GLib.Object {

		public static int Main (string[] args)
		{
			GLib.GType.Init ();
			TestObject obj = new TestObject ();
			GLib.Value val = new GLib.Value (42);
			obj.SetProperty ("my_prop", val);
			val.Dispose ();
			if (obj.MyProp != 42) {
				Console.Error.WriteLine ("Property setter did not run.");
				return 1;
			}
			GLib.Value val2 = obj.GetProperty ("my_prop");
			if ((int)val2.Val != 42) {
				Console.Error.WriteLine ("Property set/get roundtrip failed.");
				return 1;
			}
			Console.WriteLine ("Round trip succeeded.");
			return 0;
		}

		int my_prop;

		[GLib.Property ("my_prop")]
		public int MyProp {
			get { return my_prop; }
			set { 
				my_prop = value;
				Console.WriteLine ("Property setter invoked.");
			 }
		}
	}
}

Как корректно получить цвет из Gtk.ColorButton

Цвет хранится в трех значениях RGB канала. Но только в верхнем регестре возвращаемого значения типа byte

Вот пример который обычно вызывает положительные эмоции у пользователей - автодополнение при наборе текста :

[Glade.Widget()]
private Gtk.ColorButton cbtnColor;

public byte ColorRed
{
	get
	{
		//Console.WriteLine("Red {0}", cbtnColor.Color.Red);
		//Console.WriteLine("Red {0}", (cbtnColor.Color.Red / 256 ) );
		fColorRed = Convert.ToByte(cbtnColor.Color.Red / 256);
		return fColorRed;
	}
			
	set
	{
		fColorRed = value;								
	}
}
									

Автодополнение текста


// created on 03.01.2006 at 1:28
using Gtk;

public class Gui : Window
{
	public Gui() : base("Combo")
	{		
		Entry en = new Entry();
		this.Add(en);
		en.Completion = new EntryCompletion();
		ListStore l = new ListStore(typeof(string));
		l.AppendValues("Helo");
		l.AppendValues("Fuck");
		l.AppendValues("Combobox");
		en.Completion.Model =l; 
		en.Completion.TextColumn = 0;
		ShowAll();
	
	}
}

Рисовать на любом виджете очень просто

Для этого необходимо установить свойство :

Widget.AppPaintable = true;

Рисовать необходимо испольуя свойство GdkWindow

Цветовая схема реализованная в Gtksourceview 2.0 (GtkSourceView 2 in MonoDevelop)


Только что добавлена поддержка GtkSourceView 2 для MonoDevelop, и она может быть активирована с помошью конфигурационного свича :

monodevelop --enable-gtksourceview2

К сожалению Boo Binding и the Database Addin зависят на прямую от GtkSourceView# и не совместимы с API изменениями и версии 2.0. Это должно быть исправлено позже.
Хотя уже переведены на GtkSourceView2 сборки из MonoDevelop build repository
Главная причина почему это сделано - красивые схемы глубокого синего цвета "oblivion" :-)

GtkSourceView2# биндинг еще официально не реализован. И возможно будет поглощен сборкой Gnome# для биндинга платформы, но уже на сегодняшний момент все работает нормально.

Некоторые из новых возможностей :

  1. Улучшено выделение синтаксиса
  2. Поддержка цветовых схем

Список не созданных/удаленных возможностей :

  1. Печать
  2. Закладки (также используемые для точек останова если дебагер подключен)

Графического UI для изменения цветовой схемы на данный момент еще нет но это можно поправить изменя данные в в файле

~/.config/MonoDevelop/MonoDevelopProperties.xml

устанавливая следующие теги :

<Property key="GtkSourceViewStyleScheme" value="oblivion" />
<Property key="MonoDevelop.TextEditor.Document.Document.DefaultDocumentAggregatorProperties">.

20.11.2007

.NET Remouting

Пример .NET Remouting от michal_kohut@centrum.sk

Данный пример необходимо протестировать на вашем mono версии mono до 1.2.4 могут его не поддерживать :

////////////////////////////
THIS IS SERVER:
<<<>>>>

HttpServerChannel httpchannel = new HttpServerChannel(8085);
ChannelServices.RegisterChannel(httpchannel);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(nsCRemoteObj.CRemoteObj),
                               "CRemoteObjURI",
                               WellKnownObjectMode.SingleCall
                               );

///////////////////////////
THIS IS CLIENT:
<<<>>>
ChannelServices.RegisterChannel( new HttpChannel() );

IRemoteObj obj = (IRemoteObj) Activator.GetObject(
                             typeof(IRemoteObj),
                             "http://localhost:8085/CRemoteObjURI"
                              );
//calling remote procedure
Node node = new Node("127.0.0.1",12345);
Node nout = obj.TestMethod(node);
Console.WriteLine("TestMethod completed. Returned ip: {0}", nout.ipAdd);

/////////////////////////////////
MY REMOTE CLASS:
<<>>

public class CRemoteObj : System.MarshalByRefObject, IRemoteObj
       {
               public CRemoteObj()
               {
                       Console.WriteLine("CRemoteObj constructor invoked.");
               }

               ~CRemoteObj()
               {
                       Console.WriteLine("CRemoteObj destructor invoked.");
               }

               // definition of our method(s)
               public Node TestMethod(Node node)
               {
                       Console.WriteLine("CRemoteObj.TestMethod invoked.");
                       Console.WriteLine("Ip Address = {0}, Port = {1}", node.ipAdd, node.po);
                       Node nout = node;
                       nout.ipAdd = "manager";
                       return nout;
               }
       }
/////////////////////////
AND INTERFACE (includes my own object):

<<>>

// custom object which we want to pass
[Serializable]
       public class Node
       {
               public string ipAdd;
               public int po;

               public Node()
               {
               }

           public Node(string ipAddress, int port)
           {
               ipAdd = ipAddress;
               po = port;
           }
       };

       // interface which contains declaration of our method(s)
       public interface IRemoteObj
       {
               Node TestMethod(Node node);
       }
/////////////////////////////////////////////////

ASP.NET

Запуск ASP.NET веб приложения из любого другого приложения

Данный пример позволяет запустить отдельный XSP ASP.NET сервер с необходимым вам веб сайтом.

XSPWebSource source = new XSPWebSource(System.NET.IPAddress.Any,8080);
server = new ApplicationServer(source);
server.AddApplicationsFromCommandLine("/:/path/to/asp.net/application");
server.Start(true);

SMTP

Пример использования SMTP сервера от gianluca.simoni@cstnet.it

Письма отсылаются с помошью postfix :

SmtpClient smtp = new SmtpClient("mail.example.com");
smtp.Credentials = null;
smtp.Send(msg);

Localization

Локализация для monodevelop

Для того чтобы установить правильную локализацию monodevelop необходимо установить переменную bash

LANG=en_GB monodevelop

Monodoc

Добавление документации в базу данных monodoc

Для того чтобы добавить измененные данные в базу данных monodoc необходимо использовать комбинацию клавиш :

Ctrl-U

При этом данные вносятся в глобальную базу данных