动态加载引用其他DLL的DLL

3
我正在使用C# .Net 4.0。
我有以下架构部分:
1.三个“通用”DLL:X.dll,Y.dll和Z.dll。 2.一个“特别”的DLL(A.dll),它引用了“通用”DLL。 3.一个C#应用程序,可以动态加载A.dll(我使用System.Reflection.Assembly ass = Assembly.LoadFrom(filename))。
因为应用程序没有显式引用这些“通用”DLL,所以我会得到一个异常。
所以我的问题是是否有任何机会创建A.dll的方式,使得在不需要加载那些“通用”DLL的情况下可以加载此DLL。似乎我不能传输我的A.dll而不必记住它引用的所有DLL。
我相信在C# 4.0中完成它的方式背后有一个很好的逻辑,但也许有一些例外吗?
谢谢任何帮助!

你想执行 A.dll 中的代码还是访问它的资源? - Robert
A是否以特定方式打包和部署?如果是,您可以将“通用”DLL作为部署的一部分并将它们全部添加到应用程序目录中,以便它们对主应用程序“可见”吗? - Jeff B
2个回答

0

问题与上述描述相同。

“问题在于您的应用程序仅加载 A.dll,因此只有该 DLL 被复制到输出目录中,因此当 A 尝试访问 X 中的代码时会失败,因为应用程序不知道 X 的位置,因此无法加载它。”

但是,您可以将这三个“通用”DLL:X.dll、Y.dll 和 Z.dll 放入一个名为 genDllFolder 的文件夹中。

    String genDllFolder = "yourpath/genDllFolder";
    AppDomain.CurrentDomain.AppendPrivatePath(genDllFolder);
    System.Reflection.Assembly ass = Assembly.LoadFrom(filename));

我也遇到了同样的问题。在这种情况下,我能否只调用 Assembly.LoadFrom(filename); 一次,然后在不需要所有那些复杂的反射调用的情况下引用其中的所有类? - tigerden
是的,在编译之前,您可以直接引用。 - Vinit Siriah
但是在这种情况下我需要使用反射吗?如果一个类class Foo存在于dll中,那么我可以简单地执行Foo fObj = new Foo();吗? - tigerden
如果您在编译之前已经将该dll添加到Visual Studio的“添加或删除引用”对话框中,那么是的,您可以这样做。 如果ComplexNumber.dll类需要Integer.dll和String.dll,则可以直接使用对话框将Integer.dll和String.dll添加到您的解决方案中,然后Assembly.LoadFrom(filenameofComplexnodll);将不会产生错误。 如果您不想在编译之前静态地从对话框中添加它,请使用上述方法。 - Vinit Siriah

0

这里的问题是你的应用程序只加载了A.dll,因此这是唯一被复制到输出目录的DLL,所以当A尝试访问X中的代码时会失败,因为应用程序不知道X在哪里,因此无法加载它。

最简单的解决方案是将其他“通用”DLL安装到GAC中。或者,只需随应用程序一起发布这些“通用”DLL,因为除非使用A,否则它们不会被加载,但是如果不需要它们,则会增加安装/应用程序大小的不必要负担。


1
他从未说过他在引用 A.dll,而是动态加载它,这意味着 A.dll 可能不在输出目录中。 - Eluvatar
@Eluvatar,通过引用我真正的意思是“加载”,换句话说,应用程序知道从哪里加载A,问题在于它不知道从哪里加载其余部分。 - James
如果X、Y、Z进入与A加载相同的目录,这样就足够了吗? - Jeff B
假设X,Y和Z是从A引用的(它们似乎是),那么是的,应该这样做,或将它们放在全局程序集缓存中(GAC)。根据文档,CLR首先检查GAC,然后查询代码库目录。 - James

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