我有一个视觉工作室的解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动,并使用其他项目。 有一个项目叫“ProjectX”。其参考资料添加到主项目中。 ProjectX引用了另一个. net dll(例如abc.dll),它不是解决方案的一部分。
现在这个abc.dll应该被复制到主项目的bin/debug文件夹中,但它没有被复制到那里。为什么没有被复制,有什么已知的原因吗?
我有一个视觉工作室的解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动,并使用其他项目。 有一个项目叫“ProjectX”。其参考资料添加到主项目中。 ProjectX引用了另一个. net dll(例如abc.dll),它不是解决方案的一部分。
现在这个abc.dll应该被复制到主项目的bin/debug文件夹中,但它没有被复制到那里。为什么没有被复制,有什么已知的原因吗?
当前回答
当您将其设置为程序集属性时,它看起来很流畅
[AttributeUsage(AttributeTargets.Assembly)]
public class ForceAssemblyReference: Attribute
{
public ForceAssemblyReference(Type forcedType)
{
//not sure if these two lines are required since
//the type is passed to constructor as parameter,
//thus effectively being used
Action<Type> noop = _ => { };
noop(forcedType);
}
}
用法如下:
[assembly: ForceAssemblyReference(typeof(AbcDll.AnyClass))]
其他回答
我发现,如果ProjectX引用了abc.dll,但没有直接使用abc.dll中定义的任何类型,那么abc.dll将不会被复制到主输出文件夹。(它将被复制到ProjectX输出文件夹,以使它更加混乱。)
因此,如果在ProjectX的任何地方都没有显式地使用abc.dll中的任何类型,那么在ProjectX的某个文件中放置一个伪声明。
AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied
您不需要对每个类都这样做——只需一次就足以使DLL复制和一切正常工作。
附录:注意,这可能适用于调试模式,但不适用于发布模式。详见@nvirth的回答。
将DLL作为现有项添加到其中一个项目中,应该对其进行排序
在代码中不需要dummy 只是:
向可执行项目添加引用
或/并确保在可执行项目中的引用有“复制本地”设置为TRUE(这是我的“错误”),似乎这“覆盖了”在基本引用库项目中的设置…
是的,您需要将“本地复制”设置为true。但是,我非常确定您还需要从主项目引用该程序集,并将Copy Local设置为true—它不仅仅是从依赖的程序集复制。
您可以通过单击References下的程序集并按F4来获得Copy Local属性。
这是对nvirth示例的轻微调整
internal class DummyClass
{
private static void Dummy()
{
Noop(typeof(AbcDll.AnyClass));
}
private static void Noop(Type _) { }
}