【问题标题】:Why doesn't Visual Studio 2012 remember my 'Copy Local' preferences?为什么 Visual Studio 2012 不记得我的“复制本地”首选项?
【发布时间】:2014-02-21 16:14:23
【问题描述】:

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

在 Visual Studio 2008 中一切正常,但在升级到 2012 后,我们似乎无法再更改这些属性。例如,我有一个程序集,我想禁用“复制本地”,但是当我将其更改为 False 并单击应用时,设置恢复为 True。

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

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

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

然而,当什么都没有设置时,它会复制本地:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 谢谢汉斯。一如既往,您是正确的,但这并不能解释为什么 GUI 不记得该设置。看来我们在“复制本地”选项中观察到的错误(正如您所说,确实是要更改的错误)不是问题的根源。从我们看到的情况来看,在项目文件中,“CopyLocal”似乎已被“Private”XML 标记所取代。更改“CopyLocal”设置会更改 XML 文件,但不会影响 Visual Studio GUI 中的项目设置。
      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 2012-11-12
      • 2011-06-24
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2019-03-18
      相关资源
      最近更新 更多