无法加载文件或程序集中的一个或多个依赖项。系统找不到指定的文件。

4
我有这样的一段代码
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'时,第一次我会得到'assembly as _rounded_treeGOLD, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' and以及'type'为{Name = "_rounded_tree" FullName = "_rounded_tree"}'的值。但是,如果在保存后重新启动应用程序,我不能获取'assembly'的值,会出现异常'无法加载文件或程序集'_rounded_treeGOLD、版本=0.0.0.0、文化=中性、公钥令牌=null'或其某个依赖项。系统找不到指定的文件。":"_rounded_treeGOLD、版本=0.0.0.0、文化=中性、公钥令牌=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>。第一次没有问题,但如果我重新启动应用程序,我会收到异常。


以下链接可能会有所帮助:https://dev59.com/7nRC5IYBdhLWcg3wG9Nb,https://dev59.com/KkjSa4cB1Zd3GeqPIcyJ,https://dev59.com/b1PTa4cB1Zd3GeqPfwxK,http://stackoverflow.com/questions/5004514/could-not-load-file-or-assembly-or-one-of-its-dependencies-the-system-cannot-f(待续...) - Igby Largeman
https://dev59.com/JEnSa4cB1Zd3GeqPPZpS,https://dev59.com/QUnSa4cB1Zd3GeqPOoa0,https://dev59.com/KG855IYBdhLWcg3wNxgM,http://stackoverflow.com/questions/6993563/wcf-could-not-load-file-or-assembly-the-system-cannot-find-the-file-specifi,https://dev59.com/wEjSa4cB1Zd3GeqPI9qb等。 - Igby Largeman
1
可能是重复的问题:无法加载文件或程序集之一或其依赖项 - StayOnTarget
2个回答

8

这是因为你要加载的程序集可能引用了另一个不存在于同一目录或系统目录中的程序集,将所有程序集放在同一个文件夹中即可解决问题。我只是复制粘贴了我的代码,但很明显存在问题。

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

这个汇编文件是否存在于同一个文件夹中,如果是的话。 - DeveloperX
它在 .net 的第四个版本中引入。 - DeveloperX
不错,这对我有用。谢谢。注意注释:只有当公共语言运行时尝试绑定到程序集并失败时,才会调用此处理程序。 - Joe.wang
AppDomain.AssemblyResolve会在程序集解析失败时发生。 - Joe.wang

0

我遇到了同样的问题,如果你正在开发SharePoint项目,有时可能会出现参考引用未打包至WSP文件,导致在部署时这些引用的dll文件无法被部署。解决办法是手动从GAC中添加这些dll文件,或者强制将它们打包进WSP文件中,最后一种方法对我来说解决了这个问题。


SharePoint与这个问题有什么关系?这是一个WinForms的问题。 - Fls'Zen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接