c# - 程序集正在构建之外进行优化

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

我有一个装满类的程序集,这些类在另一个程序集中实现接口(interface)。例如:

Main Assembly (Reference to both assemblies)

Shared Assembly
-----IModule 

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

Main 程序集没有直接引用 Class 程序集中的任何类型。我正在寻找这样的类型:

// 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 将这个程序集包含在输出目录中?主应用程序应该不知道类程序集中的任何类型。

最佳答案

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

如果您浏览到它,并且它不在 GAC 目录中,那么这种优化是意料之中的。在 Solution Explorer 中选择您的引用,并确保属性窗口中的“Copy Local”设置为 true。您可能会尝试切换此设置,即使它是。您的 .vsproj 文件可能只需要重建以包含引用。

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

关于c# - 程序集正在构建之外进行优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26375626/

相关文章:

c# - 如何从文本框(Windows 窗体)检查主键是否存在于我的数据库中,c#

c# - 用C#写一个XML文件到特定的XML结构

c# - 可以要求我的事件的处理程序立即返回吗?

python - 检测类实例变量值中的重复项

Java - Class.isInstance() 总是返回 false

c# - 如何将字符串转换为UTF8?

c# - 使用 Google Contacts API v3,如何获取特定组的联系人?

c# - 服务引用不会为 DateTime 创建 'specified' 属性

c# - Integer 是创建在栈上还是堆上?

c# - 通过反射设置属性值不起作用,而在 C# 中直接设置它可以工作