C# VisualStudio2010中的问题是,更改资源会将构造函数设置为内部

C# VisualStudio2010中的问题是,更改资源会将构造函数设置为内部,c#,silverlight,visual-studio-2010,windows-phone-7,resources,C#,Silverlight,Visual Studio 2010,Windows Phone 7,Resources,在开发Silverlight应用程序和使用项目资源(.resx)时,我遇到了Visual Studio 2010的一些奇怪行为 每次我更改资源时,它都会在代码隐藏中将自身设置为内部而不是公共,尽管我可以在设计模式中看到它设置为公共,但事实并非如此 你知道怎么解决这个问题吗 我不知道这是否只影响Silverlight项目,或者通常影响所有C#项目。此链接可能会有所帮助 它说: 结果发现VS中有一个缺陷 在这里建立行动逻辑;不幸地 更改此工具操作将不起作用 翻转类的访问级别 从内部到公共的构造函数

在开发Silverlight应用程序和使用项目资源(.resx)时,我遇到了Visual Studio 2010的一些奇怪行为

每次我更改资源时,它都会在代码隐藏中将自身设置为内部而不是公共,尽管我可以在设计模式中看到它设置为公共,但事实并非如此

你知道怎么解决这个问题吗

我不知道这是否只影响Silverlight项目,或者通常影响所有C#项目。

此链接可能会有所帮助

它说:

结果发现VS中有一个缺陷 在这里建立行动逻辑;不幸地 更改此工具操作将不起作用 翻转类的访问级别 从内部到公共的构造函数 (至少对于强类型的 语言)。公共构造函数是 Silverlight的另一个要求 类的XAML用法。你会有 在中手动执行此操作 designer.cs文件

希望这有帮助

编辑:-

这是另一个上面写着

最后,VisualStudio还面临一个问题 一种长期存在的臭虫,会离开 ResourceManager的构造函数 它生成的包装类标记为 当您更改类的 访问公共资源。这意味着 无论何时修改主 RESX文件,强制代码重新生成,您 必须手动将内部更改为 在 生成的代码。我不明白为什么会这样 这一切都没有解决 好几年了,但还没有


最好的解决方案是将用于生成.cs文件后面的资源代码的工具切换为自动将构造函数作为公共而不是内部输出的工具。我找到的最好的一个是从。下载并运行,然后将.resx资源文件的“自定义工具”属性更改为“PublicResourceCodeGenerator”。

我的方法是配置一个预构建事件,该事件将.Designer.cs文件中的“内部”替换为“公共”。我有整个过程,从创建本地化字符串到绑定它们以及配置预构建事件命令行

该过程的核心是获取一个文本文件替换实用程序(称为replace.EXE),并设置如下预构建操作:

c:\utility\replace\replace.exe“$(ProjectDir)\LocalizedStrings.Designer.cs”“内部”“公共”

$(ProjectDir)是一个VS内置宏,用于返回项目文件夹的路径

我还在同一篇文章中给出了一个简单替换实用程序源代码的示例。

解决方法:

从生成的类继承另一个类

public class TextRes2 : TextRes
{
  public TextRes2() { }
}
用它代替原来的

<ResourceDictionary>
  <!--res:TextRes x:Key="Strings" /-->
  <res:TextRes2 x:Key="Strings" />
</ResourceDictionary>

所有这些解决方案都有问题——至少在我们的案例中是这样

我们的资源文件都由第三方codegen工具修改,该工具更新资源文件以匹配UI中所做的更改。它所做的只是更新xml中的字符串。我们仍然需要进入VS并将访问修饰符从Public切换到其他内容,然后返回Public,这样VS将同步后面的代码以匹配新的字符串值。然后我们必须通过将内部更改为公共来更新c#


所以对我们来说,我们需要两个步骤都是自动化的,一个是重新生成代码,另一个是修复内部代码。

很遗憾,没有热修复程序,但我也不想在我的项目中添加额外的代码来实现这一点,因为现在我将手动从内部代码更改为公共代码。感谢您的发现。您可以编辑生成的代码,但是VS会在您的resx文件中的每次更改时将ctor重置为internal,这让您很恼火。