Странное поведение при смешивании загрузки блоков с помощью блока. LoadFrom и блок. Загрузка

//Here Is The Working Code :

public class YWSample
{
    const string cURL = "https://weather-ydn-yql.media.yahoo.com/forecastrss";
    const string cAppID = "Your-App-ID";
    const string cConsumerKey = "Your-Consumer-Key";
    const string cConsumerSecret = "Your-Consumer-Secret";
    const string cOAuthVersion = "1.0";
    const string cOAuthSignMethod = "HMAC-SHA1";
    const string cWeatherID = "woeid=727232";  // Amsterdam, The Netherlands
    const string cUnitID = "u=c";           // Metric units
    const string cFormat = "xml";

    //Code to get timestamp
    static string _get_timestamp()
    {
        var lTS = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        return Convert.ToInt64(lTS.TotalSeconds).ToString();
    }  

    //Code to get nonce
    static string _get_nonce()
    {
        return Convert.ToBase64String(
         new ASCIIEncoding().GetBytes(
          DateTime.Now.Ticks.ToString()
         )
        );
    }  // end _get_nonce

    static string _get_auth()
    {
        var lNonce = _get_nonce();
        var lTimes = _get_timestamp();
        var lCKey = string.Concat(cConsumerSecret, "&");
        var lSign = $"format={cFormat}&" + $"oauth_consumer_key={cConsumerKey}&" + $"oauth_nonce={lNonce}&" +
                       $"oauth_signature_method={cOAuthSignMethod}&" + $"oauth_timestamp={lTimes}&" +
                       $"oauth_version={cOAuthVersion}&" + $"{cUnitID}&{cWeatherID}";

        lSign = string.Concat(
         "GET&", Uri.EscapeDataString(cURL), "&", Uri.EscapeDataString(lSign)
        );

        using (var lHasher = new HMACSHA1(Encoding.ASCII.GetBytes(lCKey)))
        {
            lSign = Convert.ToBase64String(
             lHasher.ComputeHash(Encoding.ASCII.GetBytes(lSign))
            );
        }  // end using

        return "OAuth " +
               "oauth_consumer_key=\"" + cConsumerKey + "\", " +
               "oauth_nonce=\"" + lNonce + "\", " +
               "oauth_timestamp=\"" + lTimes + "\", " +
               "oauth_signature_method=\"" + cOAuthSignMethod + "\", " +
               "oauth_signature=\"" + lSign + "\", " +
               "oauth_version=\"" + cOAuthVersion + "\"";

    }  // end _get_auth

    public static void Main(string[] args)
    {
        const string lURL = cURL + "?" + cWeatherID + "&" + cUnitID + "&format=" + cFormat;

        var lClt = new WebClient();

        lClt.Headers.Set("Content-Type", "application/" + cFormat);
        lClt.Headers.Add("Yahoo-App-Id", cAppID);
        lClt.Headers.Add("Authorization", _get_auth());

        Console.WriteLine("Downloading Yahoo weather report . . .");

        var lDataBuffer = lClt.DownloadData(lURL);

        var lOut = Encoding.ASCII.GetString(lDataBuffer);

        Console.WriteLine(lOut);

        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }//end of Main

}  // end YWSample 
5
задан Valentin Rocher 22 January 2010 в 16:56
поделиться

2 ответа

Это не странно. Согласно документации, загружающейся с Загрузкой и LoadFrom, поместит блоки в различные контексты. Это могло бы помочь.

  1. Какое-либо объяснение, почему CLR игнорирует уже загруженный блок?

Поскольку они находятся в другом контексте.

  1. Какая-либо идея, как я могу облегчить эту проблему?

Загрузка из того же контекста или справка CLR находят блок, возможно, путем присоединения обработчика к AppDomain.AssemblyResolve.

Альтернатива

Если местоположение, из которого Вы загружаете блоки, является подпапкой под AppDomain. BaseDirectory можно просто добавить запись в App.config:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

9
ответ дан 18 December 2019 в 10:49
поделиться

@Kent Boogart: Это, кажется, корректное объяснение. Для полного объяснения у Suzanne Cook есть это сообщение в блоге, которое уточняет немного больше, чем исходный, который Вы отправили: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

Следующее является усилением кода AppDomain. AssemblyResolve -

 // register to listen to all assembly resolving attempts:
 AppDomain currentDomain = AppDomain.CurrentDomain;
 currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);


 // Check whether the desired assembly is already loaded
 private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
    foreach (Assembly assembly in assemblies) {
       AssemblyName assemblyName = assembly.GetName();
       string desiredAssmebly = args.Name;
       if (assemblyName.FullName == desiredAssmebly) {
           return assembly;
       }
    }

    // Failed to find the desired assembly
    return null;
 }
7
ответ дан 18 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: