我有一个简单的Windows窗体(C#,. NET 2.0)应用程序,使用Visual Studio 2008构建.
我想支持多种UI语言,并使用表单的"Localizable"属性和特定于文化的.resx文件,本地化方面可以无缝轻松地工作.Visual Studio会自动将特定于文化的resx文件编译为附属程序集,因此在我编译的应用程序文件夹中,存在包含这些附属程序集的特定于文化的子文件夹.
我希望将应用程序部署(复制到位)作为单个程序集,但仍保留包含多组特定于文化的资源的能力.
使用ILMerge(或ILRepack),我可以将附属程序集合并到主可执行程序集中,但标准的.NET ResourceManager回退机制找不到编译到主程序集中的特定于文化的资源.
有趣的是,如果我采用我的合并(可执行)程序集并将其副本放入特定于文化的子文件夹中,那么一切正常!同样,当我使用Reflector(或ILSpy)时,我可以在合并的组合中看到主要和特定于文化的资源.但是将主程序集复制到特定于文化的子文件夹中无论如何都会破坏合并的目的 - 我真的需要只有一个单一程序集的副本......
我想知道是否有任何方法可以劫持或影响ResourceManager回退机制,以在同一个程序集中查找特定于文化的资源,而不是在GAC和文化命名的子文件夹中查找.我看到了以下文章中描述的回退机制,但没有关于它如何被修改的线索:BCL团队关于ResourceManager的博客文章.
有谁有想法吗?这似乎是一个相对常见的在线问题(例如,Stack Overflow上的另一个问题:" ILMerge和本地化资源程序集 "),但我没有在任何地方找到任何权威答案.
按照下面的casperOne的建议,我终于能够做到这一点.
我在这里提出解决方案代码,因为casperOne提供了唯一的答案,我不想添加自己的答案.
通过从"InternalGetResourceSet"方法中实现的Framework资源查找回退机制中拉出内容并使我们的同一组件搜索成为第一个使用的机制,我能够使它工作.如果在当前程序集中找不到资源,那么我们调用基本方法来启动默认搜索机制(感谢下面的@Wouter注释).
为此,我派生了"ComponentResourceManager"类,并且只覆盖了一个方法(并重新实现了一个私有框架方法):
class SingleAssemblyComponentResourceManager :
System.ComponentModel.ComponentResourceManager
{
private Type _contextTypeInfo;
private CultureInfo _neutralResourcesCulture;
public SingleAssemblyComponentResourceManager(Type t)
: base(t)
{
_contextTypeInfo = t;
}
protected override ResourceSet InternalGetResourceSet(CultureInfo culture,
bool createIfNotExists, bool tryParents)
{
ResourceSet rs = (ResourceSet)this.ResourceSets[culture];
if (rs == null) …Run Code Online (Sandbox Code Playgroud) 我正在寻找建立一个与git密切联系的应用程序.
是否有可用的语言绑定,如果有,哪些是最全面的?
这是否意味着去Bare Metal C?
或者perl/python/php/C#有一组完整的绑定吗?
谢谢
丹尼尔
我正在使用二进制序列化(BinaryFormatter)作为临时机制,将状态信息存储在一个相对复杂(游戏)对象结构的文件中; 文件比我想象的要大得多,我的数据结构包括递归引用 - 所以我想知道BinaryFormatter是否实际存储了相同对象的多个副本,或者我的基本"对象和值的数量是否应该有"arithmentic是偏离基础的,或者其他地方的过度规模来自于.
搜索堆栈溢出我能够找到Microsoft的二进制远程格式的规范:http://msdn.microsoft.com/en-us/library/cc236844( PROT.10) .aspx
我找不到的是任何现有的查看器,它使您能够"查看"二进制格式化输出文件的内容 - 获取文件中不同对象类型的对象计数和总字节数等;
我觉得这一定是我的"google-fu"让我失望(我什么都没有) - 任何人都可以帮忙吗?这一定是以前做过的,对吧?
更新:我找不到它并且没有得到答案所以我把相对快速的东西放在一起(链接到下面的可下载项目); 我可以确认BinaryFormatter不存储同一对象的多个副本,但它会向流中打印相当多的元数据.如果您需要高效存储,请构建自己的自定义序列化方法.
我们在不同的办公室有多个开发团队,他们需要在我们的项目web.config和app.config文件中进行大量配置设置的不同值.
我们希望使用一组合理的默认值来检查这些配置文件,这样通过检查trunk/master分支,您可以正常工作而无需挖掘配置文件.
从历史上看,我们已经使用了Subversion,特别是TortoiseSVN,这提供了一种管理本地更改的简便方法:我们只是将这些文件添加到TortoiseSVN的自动更改ignore-on-commit列表中.这可以防止意外签入这些文件,因为您需要专门选择它们以将其包含在签入中(并且您可以确保检查重大更改,而不是本地配置噪声).这种方法的主要缺点是配置文件总是看起来"已更改",因此无法一目了然地知道您是否有任何本地更改.
我们正在寻求转向Git,我正在努力找出最好的方法.
首先,其他StackOverflow答案中已有的内容:
选项1:检入xxx.sample文件和.gitignore实际配置文件:建议这样做,例如,在此答案中.我看到的主要问题是,在两个不同的点上很容易忘记对配置文件的更改:提交者很容易错过他们需要添加到.sample文件中的更改,而消费者(尤其是持续集成服务器)很容易错过他们需要将.sample文件中的更改合并到本地配置文件中.所以基本上,这似乎不是一个很好的解决方案.
选项2:拥有一个已签入的xxx.defaults文件和一个.gitignored xxx.local配置文件,该文件会覆盖它定义的任何设置:例如,这里提供了这个.问题是我们正在使用标准的.Net配置提供程序 - 当Mirosoft已经完成所有工作时,我真的不希望我们实现一个全新的设置加载框架.有没有人知道一种方法来获取app.config和web.config文件来引用可选的本地覆盖文件?
选项3:让开发人员保留本地分支机构,然后让他们总是检查樱桃选择或重新分支到主服务器,以便始终绕过/避免其本地分支中的不需要的提交:这是作为一个可能的工作流程在这里提供,而我在变更跟踪(所有签入的内容)方面欣赏它的清洁度,它在每次签入时都会引入大量所需的开销; 这是一个很大的痛苦!
方案4:有配置文件签入,但他们打上--assume-unchanged:这是献作为一个可能的选项,在这里 ; 据我所知,它与ignore-on-commitTortoiseSVN中的更改列表在精神上非常相似,除非您在提交过程中无法看到这些"隐藏"已更改的文件; 例如,TortoiseGit会显示带有"已更改"图标覆盖的文件,但在提交对话框中,文件根本不会显示.这看起来有点可怕,再次很容易忘记检查更改.
鉴于这些选项,我发现的所有选项,我真的希望有一种方法可以选择"包含"本地配置文件到/登录的app.config/web.config文件中,然后选择2 ; 有没有人知道这样做的方法,或者我缺少的其他选择?(我很想去考虑一个自定义的Xml合并预构建步骤......)
我之前应该提到,我们仍然在VS2008上,所以配置转换不可用.
更新:(删除,是完全错误的)
更新2:我删除了我以前的更新和答案,它是愚蠢的/不起作用.我没有意识到在"我们的"合并之后,另一个方向的下一次合并会带回这些文件的"原始"版本(覆盖本地分支的变化); 如果您有兴趣,请参阅编辑历史记录.这个问题和以往一样开放.
是否有一种从VBS脚本中访问网络共享的好方法,使用备用凭据(而不是运行VBS脚本的凭据)?
目的是执行两项任务:
据我所知,FSO(Scripting.FileSystemObject)不在图片中,因为它始终使用应用程序的凭据运行 - 这将是本地计算机用户.(?)
我在google搜索准备批处理文件(或扩展调用"cmd.exe")时发现的唯一可行的方法,使用"net use"提供远程共享凭据,然后使用robocopy等复制文件,来自同一个命令shell"session".这样可以将文件从本地驱动器复制/部署到远程共享,但是以这种方式进行任何类型的文件系统浏览(就像使用FSO一样)都会非常复杂和脆弱.
我考虑过的另一种可能性涉及两个脚本会话 - 您调用脚本(在命令行中提供备用凭据)并运行cmd.exe会话,该会话首先执行"net use"以将远程共享映射到临时本地驱动器,然后以"实际做东西"模式运行并使用FSO,然后当它完成(返回cmd.exe shell)时,再次使用"net use"断开临时驱动器.这是笨重的(多个窗口,临时驱动...),我甚至不确定它会工作.
有人知道任何一种方式,或知道可行的替代方案吗?(坚持在Windows 2000机器上使用VBScript/WScript - 没有PowerShell!)
我有一个sql语句如下:
SELECT [User].[ID],
[User].[Name],
[User].[Email]
FROM [User]
WHERE Email = 'user@home.com''
Run Code Online (Sandbox Code Playgroud)
它从petaPOCO发出如下错误:
参数'@home'指定但没有传递的参数具有此名称的属性(在'SELECT [User].[ID],[User].[Name],[User].[Email] FROM [User] WHERE Email ='user@home.com'')
错误消息意味着什么?sql语句有什么问题?petaPOCO在sql语句中不接受'@'吗?我需要通过电子邮件地址进行搜索.
我有一个超过2000万行的表,当我这样做时:
DELETE [Table] WHERE ID = ?
Run Code Online (Sandbox Code Playgroud)
这需要40秒以上.ID列是群集的.
这是你可以期待的吗?还是可以优化这个?
我知道在数据库中创建过程时我可以为CLR过程定义默认值,如下所示:
CREATE PROCEDURE [dbo].[ShredXml] (
@InputXml [xml],
@AttributeElementHandling [tinyint] = 0,
@ConversionHandling [tinyint] = 0,
@RootElementName [nvarchar](255) = null
)
AS EXTERNAL NAME [ClrXmlShredder].[ClrXmlShredder].[ShredXml]
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚是否有任何方法可以说服Visual Studio在使用其"部署项目"选项时自动执行此操作...
是否有一个属性可以设置在一个参数上,告诉visual studio当你在数据库中创建proc时,你想要该参数的默认值是什么?
更新:我已经尝试设置可空性"SqlFacet",这似乎没有效果(这有道理我猜 - afaik存储的proc参数总是可以为空?)
[Microsoft.SqlServer.Server.SqlProcedure]
public static void ShredXml(SqlXml InputXml,
[SqlFacet(IsNullable = true)]SqlByte AttributeElementHandling,
[SqlFacet(IsNullable = true)]SqlByte ConversionHandling,
[SqlFacet(MaxSize = 255, IsNullable = true)]string RootElementName
)
{
}
Run Code Online (Sandbox Code Playgroud) sql-server deployment sqlclr visual-studio-2008 sql-server-data-tools
据我所知,ASP.NET上的默认最大堆栈大小减少到256K而不是1MB(请参阅http://support.microsoft.com/kb/932909),如何将其恢复为1MB?
忽略版本,格式化SQL代码的最佳实践是什么?
我更喜欢这种方式(方法A):
select col from a inner join b on a.id = b.id inner join c on b.id = c.id
Run Code Online (Sandbox Code Playgroud)
同事更喜欢另一个(方法B):
select col from a inner join (b inner join c on b.id=c.id) on a.id = b.id
Run Code Online (Sandbox Code Playgroud)
我想知道是否存在任何差异 - 查询优化器似乎为两者生成相同的执行计划.那也许只是可读性?
这是我第一次看到使用方法B编写的SQL,有没有其他人像这样编写SQL?我个人觉得很难读出方法B.
编辑:请注意代码在一行和大写字母,以使这两个代码更具可比性.
.net ×3
c# ×3
git ×2
sql-server ×2
app-config ×1
asp.net-3.5 ×1
assemblies ×1
binding ×1
c ×1
coding-style ×1
deployment ×1
iis ×1
localization ×1
performance ×1
petapoco ×1
sql ×1
sqlclr ×1
vbscript ×1
web-config ×1
winforms ×1