【问题标题】:Could not load file or assembly or one of its dependencies. The system cannot find the file specified无法加载文件或程序集或其依赖项之一。该系统找不到指定的文件
【发布时间】:2011-11-11 09:49:02
【问题描述】:

我有这样的代码

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”的基类和一个名为“roundedtree”的用户定义类 当'xmlSerializableType.Name'成为用户定义类'_rounded_tree'时,我第一次获得'装配as _rounded_treeGOLD, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' and的价值,所以'type作为{Name =“_rounded_tree”FullName =“_rounded_tree”}'。但保存后,如果我重新启动我的应用程序,我将无法加载“程序集”的值,出现异常“无法加载文件或程序集“_rounded_treeGOLD,版本=0.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一.系统找不到指定的文件。":"_rounded_treeGOLD, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 并且返回类型变为 null 这不应该发生

对于基类“leaf”没有问题,我将 xmlSerializableType.Name 作为“Root.Systemmodel.leaf”并且“type”变为 {Name = "leaf" FullName = "Root.Systemmodel.leaf"} 程序集将是 Root。 Systemmodel,版本=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); 如何克服这种情况

更新 这里我的数据库是 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> 第一次在这里没有问题,但是如果我重新启动我的应用程序,我会遇到异常

【问题讨论】:

标签: c# winforms visual-studio-2005


【解决方案1】:

它发生的原因可能是您要加载的程序集对同一目录或系统目录中不存在的另一个程序集的引用将所有程序集放在同一文件夹中 我只是复制粘贴我的代码,但它很清晰

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;
}

【讨论】:

  • 这个程序集是否存在于同一个文件夹中,所以是的
  • 它在 .net 版本 4 中引入
  • 很好,它对我有用。谢谢。注意 cmets:仅当公共语言运行时尝试绑定到程序集并失败时才调用此处理程序。
  • AppDomain.AssemblyResolve 在程序集解析失败时发生。
【解决方案2】:

我遇到了同样的问题,如果您在使用 SharePoint,有时引用可能不会捆绑在 WSP 中,因此,在部署时,这些引用的 dll 将不会被部署。解决方法是从 GAC 手动获取这些,或者将它们强制到 WSP 中,或者将它们复制到本地 bin。最后一个为我解决了。

【讨论】:

  • SharePoint 与这个问题有什么关系?这是一个 winforms 问题。
猜你喜欢
  • 1970-01-01
  • 2017-05-10
  • 2020-01-21
  • 2018-11-29
  • 2016-12-15
  • 2018-12-22
  • 2018-08-17
相关资源
最近更新 更多