Похоже, что результат String.GetHashCode () изменяется в зависимости от того, для какого набора команд был скомпилирован dll. Я не могу объяснить, почему это происходит внутри фреймворка, когда все ваши пулы приложений .NET 2.0+ являются 64-битными, но есть решение, которое вы можете попробовать, если хотите получить последний исходный код из кодекса и изменить несколько строк в ToolkitScriptManager.
Я не знаю, почему официальное исправление не было представлено на основании доступных комментариев - может быть, потому что все решения такие же уродливые, как и мое?
Я попытался исправить это с помощью процедуры хеширования SHA1, как описано в одном из комментариев - поэтому сначала я создал статический экземпляр поставщика SHA1Managed в классе ToolkitScriptManager, как показано ниже:
public class ToolkitScriptManager : ScriptManager
{
private static System.Security.Cryptography.SHA1Managed s = new System.Security.Cryptography.SHA1Managed();
...
тогда есть два места, где использовался хеш-код строки, который я закомментировал и заменил - один раз в функции SerializeScriptEntries:
//serializedScriptEntries.Append(scriptEntry.Name.GetHashCode().ToString("x", CultureInfo.InvariantCulture));
serializedScriptEntries.Append(Convert.ToBase64String(s.ComputeHash(System.Text.Encoding.UTF8.GetBytes(scriptEntry.Name))));
, а затем один раз в функции DeserializeScriptEntries:
//string hashCode = resourceName.GetHashCode().ToString("x", CultureInfo.InvariantCulture);
string hashCode = Convert.ToBase64String(s.ComputeHash(System.Text.Encoding.UTF8.GetBytes(resourceName)));
Возможно, более простой метод позволил бы нам просто получить доступ к 64-битному методу GetHashCode для сериализации этой строки, чтобы мы получили одинаковые результаты для 32-битных и 64-битных вызовов ...