一个。我的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帮助!!!
答案 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,那么当我尝试调用
时请参阅代码段
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:通常外部组件应该完整使用(或者包将包含所有需要的组件,以便您可以添加它们)