Не удалось загрузить файл или сборку или одну из ее зависимостей.Система не может найти указанный файл - PullRequest
3 голосов
/ 11 ноября 2011

У меня есть такой код

public static Type ToType(XmlSerializableType xmlSerializableType)
{
  string func = "XmlSerialzationType.ToType";
  Type type = null;
  if (xmlSerializableType != null && xmlSerializableType.Name != string.Empty)
  {
    type = Type.GetType(xmlSerializableType.Name);
    if (type == null)
    {
      // May be a user defined class
      try
      {
        Assembly assembly = Assembly.Load(xmlSerializableType.AssemblyName);
        type = assembly.GetType(xmlSerializableType.Name);
      }
      catch (Exception ex)
      {
        TestDebug.DebugTraceSevere(func, "Exception " + ex.ToString());
      }
    }
  }
  return type;
}

У меня есть базовый класс с именем "leaf" и пользовательский класс с именем "roundndedtree", когда 'xmlSerializableType.Name' становится пользовательским классом '_olved_tree', впервые яполучаю значение для 'ассемблера as _rounded_treeGOLD, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' a и т. д. для' type как {Name = "_olved_tree" FullName = "_tained_tree"} '.Но после сохранения, если я перезапускаю свое приложение, я не могу загрузить значение для «сборки», получая исключение » Не удалось загрузить файл или сборку« _ounded_treeGOLD, Версия = 0.0.0.0, Культура = Нейтральный, PublicKeyToken = null »или одна из его зависимостей,Системе не удается найти указанный файл. ":" _ Rounded_treeGOLD, Version = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null 'и тип возвращаемого значения становится нулевым, этого не должно происходить

Для базового класса "leaf"без выдачи я получу xmlSerializableType.Name как «Root.Systemmodel.leaf», и «type» станет {Name = "leaf" FullName = "Root.Systemmodel.leaf"} Сборка будет Root.Systemmodel, Version = 8.0.7.0,Культура = нейтральная, PublicKeyToken = 83bd062a94e26d58 Что я должен делать в этих условиях Это небольшой фрагмент кода, который сгенерирует сборку для пользовательского класса

public Type CreateType()
      {
         string func = "ManagedClass.CreateType";

         // Create instances of AssemblyBuilder and ModuleBuilder for the new Type
         AppDomain myDomain = Thread.GetDomain();
         AssemblyName myAsmName = new AssemblyName();

         // Create the assembly name by appending the machine name to the typename.
         myAsmName.Name = this.TypeName + Environment.MachineName;
         // Define assembly that can be executed but not saved
         this.UserClassAssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.Run);
         // Create dynamic module with symbol information
         this.UserClassModuleBuilder = this.UserClassAssemblyBuilder.DefineDynamicModule("userdefinedmodule", true);

ОБНОВЛЕНИЕ

вероятномоя сборка создается для пользовательского класса, но не сохраняется, это может быть причиной того, что я не сталкиваюсь с какой-либо проблемой в первый раз, когда я закрою приложение, я потеряю его, увидев мой код

// Define assembly that can be executed but not saved
         this.UserClassAssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName,

AssemblyBuilderAccess.Run); howЧтобы преодолеть эту ситуацию

ОБНОВЛЕНИЕ Здесь моя база данных представляет собой XML-файлы.Когда я проверил наличие листа базового класса, я вижу, что запись <Name>Root.Systemmodel.WindowsSystem</Name><AssemblyName>Root.Systemmodel, Version=8.0.7.0, Culture=neutral, PublicKeyToken=83bd062a94e26d58</AssemblyName>, в этом случае, если перезапустить мое приложение, никаких проблем, но для пользовательского класса "roundedtree" xml запись - <Name>_rounded_tree</Name> <AssemblyName>_rounded_treeGOLD, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</AssemblyName> Здесь в первый раз проблем нет, но если я перезапущумое заявление я получаю исключение

Ответы [ 2 ]

7 голосов
/ 11 ноября 2011

это происходит потому, что, возможно, сборка, которую вы собираетесь загрузить, ссылается на другую сборку, которой нет в том же каталоге или системном каталоге, все сборки помещаются в одну папку Я только что скопировал и вставил мой код, но он очищен

private string asmBase;
public Type[] GetAllTypeinAssembly(string assemblyName)
{
    asmBase = System.IO.Path.GetDirectoryName(assemblyName);

    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    System.Reflection.Assembly asm = System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(assemblyName));//domain.Load(bt) ;// 

    return asm.GetTypes();
}


private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    //This handler is called only when the common language runtime tries to bind to the assembly and fails.

    //Retrieve the list of referenced assemblies in an array of AssemblyName.
    Assembly MyAssembly, objExecutingAssemblies;
    string strTempAssmbPath = "";
    objExecutingAssemblies = args.RequestingAssembly;
    AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();

    //Loop through the array of referenced assembly names.
    foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
    {
        //Check for the assembly names that have raised the "AssemblyResolve" event.
        if (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(",")))
        {
            //Build the path of the assembly from where it has to be loaded.                
            strTempAssmbPath = asmBase + "\\" + args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
            break;
        }

    }
    //Load the assembly from the specified path.                    
    MyAssembly = Assembly.LoadFrom(strTempAssmbPath);

    //Return the loaded assembly.
    return MyAssembly;
}
0 голосов
/ 22 февраля 2013

У меня была та же проблема, если вы работаете в SharePoint, иногда ссылки могут не связываться в WSP, поэтому при развертывании эти ссылочные библиотеки не будут развернуты. Решение заключается в том, чтобы вручную передать их из GAC или принудительно перенести в WSP или скопировать их в локальную корзину. Последний решен для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...