为什么Visual Studio 2012不记得我的'Copy Local'首选项?

问题描述:

我有一个应用程序与我从Visual Studio 2008升级到Visual Studio 2010的各种引用。在该应用程序中,各种引用在某些情况下将复制本地设置为false,以防止VS生成数百个“对象已定义”错误消息。为什么Visual Studio 2012不记得我的'Copy Local'首选项?

这一切都在Visual Studio 2008中正常工作,但升级到2012年后,似乎我们不能再改变这些属性。例如,我有一个要禁用“复制本地”的程序集,但是当我将其更改为False并单击应用时,设置将还原为True。

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

编辑 - 无论是否使用“复制本地”的,有显得有些奇怪的行为。要复制该问题,请启动一个新的控制台项目,添加一个类库并从控制台项目中引用它。控制台项目设置显示此:

enter image description here

...但该项目的档案上写着什么,即:

enter image description here

没事的时候设置的行为,但是,它确实副本本地:

enter image description here

在切换CopyLocal后从falsetrue项目和保存项目文件时,它现在包含:

enter image description here

...但是GUI总是说假的!

enter image description here

我刚刚上调Microsoft connect这个bug。

各种文献有复制本地设置为false

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

你一定是在谈论另一个设置,在VS2008中“在构建中使用”和“在构建中使用依赖关系”与您的问题有关。这在VS2012中是不同的,VS2012是VS2010中构建的一部分。

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

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

+1

感谢Hans。尽管你是正确的,但这并不能解释为什么GUI不记得这个设置。看起来,我们在“复制本地”选项中观察到的错误(正如您所说的,确实是错误的改变)并不是问题的根源。从我们所看到的情况看,在项目文件中,'CopyLocal'已被'Private'XML标签取代。更改“CopyLocal”设置会更改XML文件,但不会影响Visual Studio GUI中的项目设置。 –