【问题标题】:could not load dll or one of its dependency无法加载 dll 或其依赖项之一
【发布时间】:2009-10-21 09:51:19
【问题描述】:

一个。我的 C# 程序将加载一个 dll(它是动态的),现在让我们使用 a.dll(类似地,我的程序将加载更多的 dll,如 b.dll、c.dll 等......)。

b.我的程序将在 a.dll 中调用“Onstart”方法(对于所有 dll,它都是常量)。

我可以通过反射机制实现以上两种情况。

问题是

一个。如果我的 a.dll 有任何引用说 xx.dll 或 yy.dll,那么当我尝试调用时

我的程序中 a.dll 的 OnStart 方法。我得到“无法加载 dll 或其依赖项之一”。 见代码sn-p

Assembly assm = Assembly.LoadFrom(@"C:\Balaji\Test\a.dll");

foreach (Type tp in assm.GetTypes())
{
    if (tp.IsClass)
    {
        MethodInfo mi = tp.GetMethod("OnStart");

        if (mi != null)
        {
            object obj = Activator.CreateInstance(tp);
            mi.Invoke(obj,null);
            break;
        }
   }
}

通常我在“object obj = Activator.CreateInstance(tp);”行上遇到错误这是因为 a.dll 有 xx.dll 的引用,但在我的程序中我没有 xx.dll 的引用。另外,我的程序中不能有 xx.dll 的引用,因为 a.dll 是一个外部程序集,它自己可以有任何引用。

请帮忙!!!

【问题讨论】:

    标签: c# reflection dll assemblies reference


    【解决方案1】:

    看看这个:http://bytes.com/topic/c-sharp/answers/232691-how-dynamically-load-assembly-w-dependencies。基本上,在 AssemblyResolve 事件中,您需要手动加载引用的程序集。

    private Assembly AssemblyResolveHandler(object sender,ResolveEventArgs e)
    {
        try
        {
            string[] assemblyDetail = e.Name.Split(',');
            string assemblyBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            Assembly assembly = Assembly.LoadFrom(assemblyBasePath + @"\" + assemblyDetail[0] + ".dll");
            return assembly;
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Failed resolving assembly", ex);
        }
    }
    

    不是最好的代码,但应该能给你一个大致的想法,我希望。

    然而,我同意插件 dll 应该被打包成完整的、无依赖的使用。如果允许他们加载您无法控制的程序集,那么谁知道会发生什么。

    【讨论】:

      【解决方案2】:

      也许您的应用程序无法使用第二个 DLL 引用?

      确保第二个 DLL 与第一个 DLL 位于同一目录中,或者确保应用程序配置为在包含第二个 DLL 的目录中查找。

      【讨论】:

        【解决方案3】:

        我认为除了添加所有使用的引用之外,您无能为力。 ps:通常外部程序集应该是完整的以供使用(或者包将包含所有需要的程序集,因此您可以添加它们)

        【讨论】:

          【解决方案4】:

          我认为,它需要更多解释。让我解释一下……

          一个。我的 C# 程序将加载一个 dll(它是动态的),现在让我们使用 a.dll(类似更多的 dll,如 b.dll、c.dll 等......)。

          b.我的程序将在 a.dll 中调用方法“Onstart”(对于所有 dll 来说都是常量)。

          我可以通过反射机制实现以上两种情况。

          问题是

          一个。如果我的 a.dll 有任何引用说 xx.dll 或 yy.dll,那么当我尝试调用时

          我的程序中 a.dll 的 OnStart 方法。我得到“无法加载 dll 或其依赖项之一”。

          查看代码sn-p

          Assembly assm = Assembly.LoadFrom(@"C:\Balaji\Test\a.dll");
          foreach (Type tp in assm.GetTypes())
          {
              if (tp.IsClass)
              {
                  MethodInfo mi = tp.GetMethod("OnStart");
                  if (mi != null)
                  {
                      object obj = Activator.CreateInstance(tp);
                      mi.Invoke(obj,null);
                      break;
                  }
              }
           }
          

          通常我在“object obj = Activator.CreateInstance(tp);”行上遇到错误 这是因为 a.dll 有 xx.dll 的引用,但我不能有相同的引用。 另外,我的程序中不能有 xx.dll 的引用,因为 a.dll 是动态的,可以有任何自己的引用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-12-02
            • 2021-08-05
            • 2011-05-23
            • 2012-09-15
            • 2018-08-21
            • 1970-01-01
            相关资源
            最近更新 更多