String.Join(", ", Dictionary.Select(kv => String.Format("{0} = {1}", kv.Key, kv.Value)));
|
|
Alcune dettagli di configurazione applicazione mediante App.Config
Per specificare le informazioni di avvio del CLR si utilizza l'elemento startup, questo elemento è utile nel caso l'applicazione sia sviluppata con il framework 4 ma abbia referenziato assembly compilati con il framework 2:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
|
|
Un esempio che mostra come è possibile creare codice attraverso il namespace CodeDom.
In particolare viene creata una classe con un proprio costruttore, definiti campi e metodi dove il corpo del metodo viene letto da un file di testo.
|
|
In questo esempio viene mostrato come è possibile creare un metodo a runtime ed invocarlo mediante in namespace System.Reflection.Emit.
// dichiarazione del metodo in cui si specifica il nome,
// il tipo di ritorno, i parametri la classe a cui è associato
DynamicMethod print = new DynamicMethod("Print", null,
new Type[] { typeof(String) }, typeof(MyClass));
//Ottiene un generatore di MISL per il metodo Print
ILGenerator il = print.GetILGenerator(256);
//definisce un parametro per il metodo Print
print.DefineParameter(1, ParameterAttributes.In, "path");
//crea una nuova istanza della classe MyClass
il.Emit(OpCodes.Newobj, typeof(MyClass).GetConstructor(new Type[0]));
|
|
Alcune funzioni utili per leggere e scrivere uno specifico bit all'interno di un intero:
/// <summary>
/// Ottiene il valore di un bit
/// </summary>
/// <param name="value">Valore di cui è richiesto il bit</param>
/// <param name="bit">Indice del bit.</param>
/// <returns>True se il bit è 1, false se è 0.</returns>
public static bool Get(int value, byte bit)
{
return (value >> bit & 1) == 1;
}
|
|
Estensione dell'esempio
Custom Configuration Settings in App.Config (part 1) in cui viene mostrato come personalizzare il file di configurazione inserendo liste di elementi.
[ConfigurationProperty("items", IsRequired = false, IsKey = false, IsDefaultCollection = true)]
public ItemCollection Items
{
get { return ((ItemCollection)(base["items"])); }
set { base["items"] = value; }
}
|
|
Se da un'applicazione java abbiamo necessita di invocare API native o richiamare moduli sviluppati in linguaggi differenti come ad esempio C++, ci viene in aiuto Java Native Interface o JNI (letteralmente interfaccia nativa Java).
JNI è il nome di un framework di programmazione che ha lo scopo di permettere ad applicazioni Java di interfacciarsi con funzioni scritte in altri linguaggi di programmazione, in particolare C, C++ e assembly.
|
|
L'attributo Export può decorare anche un metodo, in modo analogo a una classe, una proprietà o una funzione.Le esportazioni di metodi devono specificare un tipo di contratto o un nome di contratto, dato che non è possibile dedurre il tipo.Il tipo specificato può essere un delegato personalizzato o un tipo generico, ad esempio Func.
public class Methods
{
[Export("methods")]
public String Method1()
{
return "this is method 1";
}
[Export("methods")]
public String Method2()
{
return "this is method 2";
}
}
|
|
Questo esempio mostra l'utilità di MEF nel creare applicazioni con architettura modulare in cui ogni componente grafico è posizionato in una regione definita dell'applicazione attarverso attributi che ne espongono le caratteristiche.
|
|
The following example shows how to define the properties of a custom ConfigurationSection object using the ConfigurationPropertyAttribute attribute.
The example contains two classes. The UrlsSection custom class uses the ConfigurationPropertyAttribute to define its own properties. The UsingConfigurationPropertyAttribute class uses the UrlsSection to read and write the custom section in the application configuration file.
|