为什么Visual Studio 2012不记得我的“复制本地”首选项?

时间:2014-02-21 16:14:23

标签: .net visual-studio-2012 reference c++-cli assemblies

我有一个带有各种引用的应用程序,我从Visual Studio 2008升级到Visual Studio 2010.在该应用程序中,各种引用在某些情况下将Copy Local设置为false以防止VS生成数百个对象已定义'错误消息。

这一切在Visual Studio 2008中运行良好,但在升级到2012之后,似乎我们不能再改变这些属性了。例如,我有一个我要禁用的程序集' Copy Local' on但当我将其更改为False并单击“应用”时,设置将恢复为True。

我错过了什么? VS 2012中是否有新设置取代该选项或出现其他错误?

修改 - 无论是否使用'复制本地', 似乎都是一些奇怪的行为。要复制该问题,请启动一个新的控制台项目,添加一个类库并从控制台项目中引用它。控制台项目设置显示:

enter image description here

...但项目文件什么也没说,

enter image description here

但是,设置任何内容时的行为是它复制本地:

enter image description here

将项目中的CopyLocal从false切换到true并保存项目文件后,它现在包含:

enter image description here

...但GUI总是说错误!

enter image description here

2 个答案:

答案 0 :(得分:2)

我刚刚在Microsoft connect上提出了这个错误。

答案 1 :(得分:2)

  

各种引用都将Copy Local设置为false

这可能不正确,你说的是错误的设置。复制本地在编译期间不起作用。它只是确保将程序集复制到构建目录,以便您可以调试程序。对于存储在GAC或项目引用中的程序集,它应该只是False。对于任何其他程序集, 它设置为True,否则您将无法运行程序。

您必须在谈论另一个设置,在VS2008中,“在构建中使用”和“在构建中使用依赖关系”与您的问题相关。这与VS2012不同,后者是VS2010中构建大修的一部分。

当您违反C ++中的One Definition Rule时,您会收到“已定义”的编译错误。这在C ++ / CLI中相当容易,因为它为您提供了两种方式来导入定义。首选方法是通过程序集引用,编译器从元数据中导入所有公共引用类。当以传统方式通过.h文件导入ODR时,会违反ODR。你非常强烈应该更喜欢汇编引用,类的声明不能与定义不同步。并且您不会在最终程序中获得重复的代码。另外一个令人讨厌的InvalidCastExceptions源很难排除故障,一个程序集中的类与另一个程序集中的类不同,即使它们具有相同的命名空间和类名。 .NET中强大的DLL Hell对策。

VS2008设置不再可用,您现在只有“参考组件输出”。通常设置为True,因此编译器会导入元数据中的定义,这是首选方式。