Oltre al suggerimento di Igor è possibile usare, al fine di impostare settings per l’applicazione Silverlight direttamente il file serviceReference.ClientConfig (in realtà è possibile leggere qualsiasi file presente nello xap).
Immaginiamo di avere un file fatto in questo modo:
<configuration>

  <brokerServiceConfiguration>
    <assemblies>
      <add name="MyAssembly, Version=1.0.0.0" />
    assemblies>
  brokerServiceConfiguration>
  
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="..." >
          <security mode="None">
            <transport>
              <extendedProtectionPolicy policyEnforcement="Never" />
            transport>
          security>
        binding>
      basicHttpBinding>
    bindings>
    <client>
      <endpoint address="..." 
binding="basicHttpBinding"
bindingConfiguration="sampleServiceConfig"
contract="..."
name="sampleServiceConfig" /> client> system.serviceModel> configuration>
Possiamo andare a leggere la configurazione custom presente all’inizio del file così:
var config = XDocument.Load( "ServiceReferences.ClientConfig" );
var assemblies = config.Descendants( "brokerServiceConfiguration" )
    .Descendants( "assemblies" )
    .Descendants( "add" )
    .Select( e => e.Attribute( "name" ).Value );

return assemblies.AsReadOnly();
Commnand Line
Ma non solo… nella migrazione di Radical verso la prima drop per Silverlight e Windows Phone 7 mi sono trovato di fronte ad un blocco di codice come questo:
        [Conditional( "DEBUG" )]
        void AddDelayIfAny()
        {
#if !WP7
            var cl = CommandLine.GetCurrent();

            Int32 delay;
            if( cl.TryGetValue( "asyncdelay", out delay ) )
            {
#if !SILVERLIGHT
                logger.WarnFormat( "Adding delay to async execution: {0}", delay );
#endif
                System.Threading.Thread.Sleep( delay );
            }
#endif
        }
What the hell is that?
è un pezzo del mio “Fluent AsyncWorker” che se:
  • siamo in debug;
  • e abbiamo sulla command line un parametro “AsyncDelay”;
inietta in tutte le esecuzioni asincrone un “delay” di n millisecondi, la cosa è mostruosamente comoda quando siete in debug in locale per simulare operazioni onerose.
Ora è evidente che la Command Line non esiste su Silverlight ma nulla ci vieta di simularla usando proprio gli InitParams di cui ha parlato Igor:
public class CommandLine
{
    static CommandLine _current;

    /// 
    /// Gets the current command line instance.
    /// 
    /// 
    public static CommandLine GetCurrent()
    {
        if( _current == null )
        {
            _current = new CommandLine( Application.Current.Host.InitParams );
        }
        return _current;
    }

    readonly IDictionary<String, String> initParams;

    /// 
    /// Initializes a new instance of the  class.
    /// 
    /// The current command line args.
    public CommandLine( IDictionary<String, String> initParams )
    {
        Ensure.That( initParams ).Named( () => initParams ).IsNotNull();

        this.initParams = initParams;
    }
    //omissis...
}
Come direbbe Corrado: Happy Silverlighting :-)
.m