无法加载dll或其依赖项之一

时间:2009-10-21 09:51:19

标签: c# reflection dll assemblies reference

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

湾我的程序将在a.dll中调用一个方法“Onstart”(它是所有dll的常量)。

我能通过反思机制实现上述两种情况。

问题是

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

我的程序中的a.dll的OnStart方法。我得到“无法加载DLL或其依赖”之一。 请参阅代码段

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是一个外部程序集,可以自己拥有任何引用。

Kinldy帮助!!!

4 个答案:

答案 0 :(得分: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);
    }
}

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

但是,我确实认为应该打包plugin-dlls以实现完全,无依赖性的使用。如果允许他们加载你无法控制的程序集,那么谁知道会发生什么。

答案 1 :(得分:0)

您的应用程序可能无法使用第二个DLL引用?

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

答案 2 :(得分:0)

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

一个。我的C#程序将加载一个dll(这是动态的),现在让我们拿a.dll(同样更像d.dll,如b.dll,c.dll等......)。

湾我的程序将在a.dll中调用一个方法“Onstart”(它是所有dll的常量)。

我能通过反思机制实现上述两种情况。

问题是

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

来自我的程序的a.dll的OnStart方法。我得到“无法加载DLL或其依赖”。

请参阅代码段

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是动态的,可以自己拥有任何引用。

答案 3 :(得分:0)

我认为除了添加所有使用的引用之外,你不能做任何其他事情。 ps:通常外部组件应该完整使用(或者包将包含所有需要的组件,以便您可以添加它们)