未能加载程序集C#
我有一个程序集,名为实验室,它由作为解决方案一部分的项目构建。此程序集包含一个对象,我想使用来自同一解决方案上的其他程序集的反射来访问该对象。 在其他组件(被叫BL)我有以下代码:未能加载程序集C#
Assembly assembly = Assembly.Load("Lab");
的问题是,它是扔FileNotFoundException
除非我添加尝试从实验室组件发起的对象的行代码中的任何地方。 就好像编译器将实验室程序集加载到Assembly.Load
函数的可识别位置。
这确实让我困惑, 我试图通过全集名称 而且还试图组装的绝对路径传递给Assembly.LoadFrom
但无济于事,同样的问题在所有情况下。
我试图访问对象槽反射而不是仅仅引用它的原因是因为代码是将被隔离的模块的一部分。然后反射的DLL(在这种情况下Lab.dll)将在运行时动态传递。
解决方案
事实上,正如阿夫纳解释,我怀疑,大会并没有复制到项目的文件夹,因为没有使用它的任何代码。 进一步证明程序集丢失的是FusionLog中的Lordkain在注释中提到的异常。
由于该项目的想法是在将来使用通过的Assembly Path,因此我刚刚采取了相应的措施,而不是Avner建议的解决方案。 因此,通过使用该组件的路径,而不是程序集的名称与方法:
Assembly.LoadFrom(*Assembly Path*);
我工作围绕缺少的装配问题。
检出BL项目的输出文件夹。很可能,你不会在那里找到Lab.dll。这是因为Visual Studio偶尔尝试有帮助,发现没有使用Lab.dll的可识别代码,并且实际上并没有将其复制到输出文件夹。当您使用反射代码时,静态分析无法找到任何用法,并优化了参考。
这个答案解决了这个问题,虽然从不同的角度:
MSBuild doesn't copy references (DLL files) if using project dependencies in solution
因为在你的情况你不必与二手引用的一个问题,但与动态加载,所以选项# 1是无关紧要的,你可能需要解决参考(注意:引用,不一定实例化)Lab.dll中的一个项目。
您可以通过从Lab.dll中获取对象的类型(如链接的答案显示)或访问类的Static属性(如果有)来完成此操作。丑陋,但有效。
对你有帮助https://indexoutofrange.com/Could_not_load_file_or_assembly_or_one_of_its_dependencies/ – lordkain
你需要指定程序集名称的长形式。例如'System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089' – DavidG