装配在构建之外进行优化

时间:2014-10-15 06:11:40

标签: c# .net reflection visual-studio-2013 .net-assembly

我有一个完全填充了在另一个程序集中实现接口的类的程序集。例如:

Main Assembly (Reference to both assemblies)

Shared Assembly
-----IModule 

Class Assembly (Reference to shared assembly)
-----unknownType : IModule
-----unknownType2 : IModule

主程序集没有直接引用类程序集中的任何类型。我正在寻找类似的类型:

// Load all referenced assemblies:
Assembly.GetExecutingAssembly().GetReferencedAssemblies()
    .Except(AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName()))
    .Distinct()
    .ToList()
    .ForEach(act => Assembly.Load(act));

// Find all instances of IModule in loaded assemblies:
var modules = from asm in AppDomain.CurrentDomain.GetAssemblies()
   from provider in asm.GetTypes()
   where typeof(IModule).IsAssignableFrom(provider)
   ...instantiate type etc...

如果我在类程序集中只引用了一个任意类型,那么它会显示在GetReferencedAssemblies中,被加载并正确返回 - 但是一旦我删除对该类型的引用,它就不会被转移到构建目录或显示为引用的程序集导致加载失败。

有没有办法强制VS将此程序集包含在输出目录中?主应用程序不应该知道类程序集中的任何类型。

1 个答案:

答案 0 :(得分:-1)

我想我得到了你的问题,但你能澄清一下你的问题吗?您是否期望将作为项目参考添加的程序集与应用程序一起复制到输出文件夹中?你是如何添加参考的?它是您在文件对话框中浏览的.dll或.exe,还是从“添加引用”对话框中的列表中选择的COM或GAC程序集?

如果您浏览了它,并且它不在GAC目录中,则需要进行此类优化。在解决方案资源管理器中选择您的引用,并确保属性窗口中的“复制本地”设置为true。您可以尝试切换此设置,即使它是。您的.vsproj文件可能只需要重建以包含引用。

如果您尝试从存储在字符串中的文件名引用.dll,或者在运行时选择该文件名,那么Visual Studio将无法知道您的应用程序正在使用它,但仍将其复制到您的输出目录。但是,如果你有.dll的路径,那么使用File.Copy执行此操作应该不会太难。