小编chi*_*oro的帖子

NUnit Assert.Equals vs. Assert.AreEqual

有什么区别:

  • Assert.EqualsAssert.AreEqual
  • Assert.NotNullAssert.IsNotNull
  • ...

nunit assert

17
推荐指数
2
解决办法
9511
查看次数

获得处置关闭 - 标记方法是安全的

这是关于ReSharper的警告"进入处置关闭",这通常在稍后处置的物体用于lambda时出现.在C#获得处置关闭?更详细地讨论了这一点.

我的问题是:对于采用这种lamdbas并立即执行它们的方法(因此你可以确定它们总是在处理所述对象之前执行):

有没有办法将它们标记为安全,以便使用该方法的任何代码都不再产生这些警告?

例:

using (var myObject = new MyDisposableObject())
{
    DoThisTwice(() => myObject.DoSomething());
}

...

void DoThisTwice(Action do)
{
    do();
    do();
}
Run Code Online (Sandbox Code Playgroud)

DoThisTwice接受委托(或lambda)并同步执行它.到方法返回时,将不再执行lambda.只有这样myObject才会被处理掉,所以我们很高兴.我们可以DoThisTwice用注释来标记调用行,但必须以类似的方式在所有地方使用该方法完成.相反,我想标记DoThisTwice为安全,因此Resharper不会为该方法的任何调用者显示任何警告.

c# resharper lambda closures idisposable

15
推荐指数
1
解决办法
1313
查看次数

C#静态"这个"

在C#静态方法中是否有一种方法可以引用定义方法的Type?

在实例方法中,您可以通过以下方式确定类型:

public void Foo()
{
    Type type = this.GetType();
}
Run Code Online (Sandbox Code Playgroud)

它在静态方法中会是什么样子?

public static void Bar()
{
    Type type = ....?
}
Run Code Online (Sandbox Code Playgroud)

更新:对不起,需要澄清:我知道这个typeof(...)功能.我正在寻找一个关键字或代码,它给我类型而不显式引用类名.

更新:除了开发者艺术的答案,这正是我正在寻找的,有一个更简单的方法吗?

c# static this

14
推荐指数
2
解决办法
1万
查看次数

OpenXML SDK:使Excel重新计算公式

我通过Microsoft Office OpenXML SDK 2.0更新Excel电子表格的一些单元格.更改值会使包含依赖于已更改单元格的公式的所有单元格无效.但是,由于缓存的值,Excel不会重新计算公式,即使用户单击"立即计算".

通过SDK使整个工作簿的所有依赖单元无效的最佳方法是什么?到目前为止,我在http://cdonner.com/introduction-to-microsofts-open-xml-format-sdk-20-with-a-focus-on-excel-documents.htm找到了以下代码片段:

public static void ClearAllValuesInSheet
      (SpreadsheetDocument spreadSheet, string sheetName)
{
    WorksheetPart worksheetPart =
        GetWorksheetPartByName(spreadSheet, sheetName);

    foreach (Row row in
       worksheetPart.Worksheet.
          GetFirstChild().Elements())
    {
        foreach (Cell cell in row.Elements())
        {
            if (cell.CellFormula != null &&
                  cell.CellValue != null)
            {
                cell.CellValue.Remove();
            }
        }

    }

    worksheetPart.Worksheet.Save();
}
Run Code Online (Sandbox Code Playgroud)

除了这个片段不能为我编译的事实,它有两个限制:

  • 它只会使单张纸无效,但其他纸张可能包含相关配方
  • 它没有考虑任何依赖关系.

我正在寻找一种有效的方法(特别是,只会使依赖于某个单元格值的单元格无效),并考虑所有表格.

更新:

与此同时,我设法编译和运行代码,并删除工作簿的所有工作表上的缓存值.(参见答案.)我仍然对更好/替代解决方案感兴趣,特别是如何只删除实际依赖于更新单元格的单元格的缓存值.

.net excel openxml openxml-sdk

12
推荐指数
1
解决办法
2万
查看次数

使用Wrapper对象正确清理excel互操作对象

所有这些问题:

解决了C#在使用后没有正确释放Excel COM对象的问题.解决这个问题主要有两个方向:

  1. 不再使用Excel时终止Excel进程.
  2. 注意首先明确地将用于变量的每个COM对象分配,并保证最终在每个上执行Marshal.ReleaseComObject.

有人说过2太繁琐了,你是否忘记在代码中的某些地方忘记遵守这条规则总是存在一些不确定性.仍然1对我来说似乎很脏并且容易出错,我想在有限的环境中试图杀死一个进程可能会引发安全错误.

所以我一直在考虑通过创建另一个模仿Excel对象模型的代理对象模型来解决问题2(对我来说,实现我实际需要的对象就足够了).原则如下:

  • 每个Excel Interop类都有其代理,用于包装该类的对象.
  • 代理在其终结器中释放COM对象.
  • 代理模仿Interop类的接口.
  • 最初返回COM对象的任何方法都会更改为返回代理.其他方法只是将实现委托给内部COM对象.

例:

public class Application
{
    private Microsoft.Office.Interop.Excel.Application innerApplication
        = new Microsoft.Office.Interop.Excel.Application innerApplication();

    ~Application()
    {
        Marshal.ReleaseCOMObject(innerApplication);
        innerApplication = null;
    }

    public Workbooks Workbooks
    {
        get { return new Workbooks(innerApplication.Workbooks); }
    }
}

public class Workbooks
{
    private Microsoft.Office.Interop.Excel.Workbooks innerWorkbooks;

    Workbooks(Microsoft.Office.Interop.Excel.Workbooks innerWorkbooks)
    {
        this.innerWorkbooks = innerWorkbooks;
    }

    ~Workbooks()
    {
        Marshal.ReleaseCOMObject(innerWorkbooks);
        innerWorkbooks = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我特别向你提问:

  • 谁发现这是一个坏主意,为什么?
  • 谁发现这是一个可怕的想法?如果是这样,为什么没有人实施/发布这样的模型呢?是仅仅是因为努力,还是我错过了这个想法的杀戮问题?
  • 在终结器中执行ReleaseCOMObject是不可能/不好/容易出错的吗?(我只看到过将它放在Dispose()而不是终结器中的建议 - 为什么?)
  • 如果方法有意义,有什么建议可以改进吗?

c# excel interop com-interop

11
推荐指数
1
解决办法
4479
查看次数

NHibernate用于WinForms应用程序的缓存

我有一个带有数据库后端(oracle)的C#WinForms应用程序,并使用NHibernate进行O/R映射.我想尽可能减少与数据库的通信,因为这里的网络很慢,所以我读到了二级缓存.我发现了这个非常好的介绍,它列出了以下可用的缓存实现.

我想知道我应该为我的应用程序使用哪个实现.

缓存应该很简单,它不应该显着减慢第一次出现的查询,并且它不应占用很多内存来加载实现程序集.(使用NHibernate和Castle,该应用程序已占用高达80 MB的RAM!)

  • Velocity:使用Microsoft Velocity,它是一种高度可扩展的内存应用程序缓存,适用于各种数据.
  • 普遍性:使用Bamboo.Prevalence作为缓存提供者.Bamboo.Prevalence是由Prevayler的Klaus Wuestefeld带来的对象流行概念的.NET实现.Bamboo.Prevalence为定位CLR的确定性系统提供透明对象持久性.它为智能客户端应用程序提供持久性缓存.
  • SysCache:使用System.Web.Caching.Cache作为缓存提供程序.这意味着您可以依赖ASP.NET缓存功能来了解它的工作原理.
  • SysCache2:与NHibernate.Caches.SysCache类似,使用ASP.NET缓存.此提供程序还支持基于SQL依赖性的过期,这意味着可以将某些缓存区域配置为在数据库中的相关数据发生更改时自动过期.
  • MemCache:使用memcached; memcached是一种高性能的分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态Web应用程序.基本上是分布式哈希表.
  • SharedCache:高性能,分布式和复制的内存对象缓存系统.有关详细信息,请参阅此处和此处

到目前为止我的考虑是:

  • 速度似乎相当重量级和过度杀伤(文件完全占用467 KB的磁盘空间,到目前为止还没有测量到它所需的RAM,因为我没有设法让它运行,见下文)
  • 流行,至少在我的第一次尝试中,将我的查询从约0.5秒减慢到约5秒,并且缓存不起作用(见下文)
  • SysCache似乎适用于ASP.NET,而不适用于winforms.
  • MemCache和SharedCache似乎适用于分布式场景.

你建议我使用哪一个?还有一个内置的实现,当然它非常轻量级,但引用的文章告诉我," (...)永远不应该使用这个缓存提供程序来生成代码,而只是用于测试."

除了最适合我的情况的问题,我也遇到了应用它们的问题:

  • Velocity抱怨应用程序配置文件中未指定 " dcacheClient"标记.在配置文件中指定有效标记, "虽然我为程序集创建了一个app.config文件并粘贴了本文中的示例.

  • 如上所述,普遍性严重降低了我的第一个查询速度,下次执行完全相同的查询时,另一个选择被发送到数据库.也许我应该将这个话题"外化"到另一篇文章中.我会这样做,如果有人告诉我,查询速度减慢绝对不寻常,他需要更多细节来帮助我.

c# windows nhibernate caching

11
推荐指数
1
解决办法
1733
查看次数

防止Excel退出

我错过了一个Excel.Application.Quit或一个Excel.Application.BeforeQuit事件.有人知道模仿这些事件的解决方法吗?

我通过COM Interop从C#WinForms应用程序访问Excel.给定一个Excel.Application对象,我该怎么做:

  1. 最好是防止Excel退出?
  2. 如果这不可能,我怎么能至少注意到 Excel退出的时候?

请注意:由于我有一个COM引用Excel.Application,当Excel被用户"退出"时,Excel进程不会退出.虽然这听起来很矛盾,但事实就是如此.通过"退出"我的意思是用户点击窗口右上角的"退出"或"十字按钮".窗口关闭,文件被卸载,加载项被卸载以及Excel除了我没有任何线索之外做的任何东西.但是我仍然可以使用该Application对象来"恢复"该过程并使Excel再次可见,尽管这些加载项随后丢失,而且我还不知道还有什么处于未定义状态.

为了摆脱这个问题,我想在一开始就取消退出(想想BeforeQuit Cancel = true它是否存在),或者至少在退出Excel时得到通知,这样我就可以释放COM对象并使流程真正退出,下次我再次需要Excel时,我会知道我需要先启动它.

不幸的是,它是一个恶性循环:只要Excel运行,我需要COM对象.因此, Excel退出之前,我无法处理它们.另一方面,只要COM对象存在,即使Excel假装退出,进程也不会退出,因此我不能等待进程退出事件或类似事件.

我有一种令人不快的感觉,就是我要把头撞在砖墙上......

c# com excel interop excel-2007

11
推荐指数
2
解决办法
2679
查看次数

如何强制.NET应用程序以32位模式运行

我试图在Win7 x64上运行我的.NET 3.5 WinForms应用程序.该应用程序使用NHibernate和System.Data.OracleClient来访问Oracle数据库.Oracle客户端是32位.

启动应用程序时,我收到以下错误消息

尝试加载Oracle客户端库会引发BadImageFormatException.在安装了32位Oracle客户端组件的64位模式下运行时,将发生此问题.

为此,我将构建目标定位到x86平台:

Build设置的屏幕截图

令我惊讶的是,尝试在Win7平台上执行新版本时出现了相同的错误消息.

NHibernate程序集在运行时加载Assembly.Load("...");.

可能是NHibernate DLL仍然以64位模式运行,而主机exe以32位模式运行.这听起来很奇怪.或者可能是因为某种原因,我的应用程序运行在64位模式,即使它的目标是x86?


更新:

我使用CorFlags检查了我的二进制文件,它标记为32位:

Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 3
ILONLY    : 1
32BIT     : 1
Signed    : 0
Run Code Online (Sandbox Code Playgroud)

我也在任务管理器中检查了它,它有一个*32后缀.

我还尝试并使用CorFlags将32位标志添加到我的应用程序附带的所有程序集.它仍会产生相同的错误消息.

我很困惑......困惑......困惑......

64-bit x86 corflags .net-3.5

10
推荐指数
2
解决办法
2万
查看次数

MSBuild无法使用临时密钥签署ClickOnce清单(错误MSB3326和MSB3321)

我正在尝试在Windows Server计算机上构建ClickOnce Windows窗体项目(.NET 3.5/Visual Studio 2010).(努力使用Hudson CI自动化构建过程.)

为了签署ClickOnce清单,我在Visual Studio中创建了一个临时密钥temp.pfx.我可以在我的工作站上从Visual Studio成功构建和部署项目.但是当在服务器上运行MSBuild时,我收到以下错误消息:

C:\ Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1970,9):错误MSB3326:无法导入以下密钥文件:.密钥文件可能受密码保护.要更正此问题,请尝试再次导入证书或手动将证书导入当前用户的个人证书存储区.[C:.hudson \职位[...]的csproj]

C:\ Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1970,9):错误MSB3321:导入密钥文件"temp.pfx"已取消.[C:.hudson \职位[...]的csproj]

我没有运气就尝试了以下所有问题和答案:

  • Stack Overflow问题无法导入密钥文件'blah.pfx' - 错误'密钥文件可能受密码保护'

    =>就我而言,错误消息并不表示证书存储的名称,而是表示"当前用户的个人证书存储".

    =>即使以"个人"作为容器名称(sn -i temp.pfx personal)尝试接受的答案,它也无法解析密钥:

    无法解析ALiS_TemporaryKey.pfx中的PKCS#12 blob - 发生内部错误.

  • Stack Overflow问题使用MSBuild对ClickOnce或程序集进行签名导致错误MSB3321

    =>我尝试了接受的答案,但无法导入密钥文件,因为"无法访问用户配置文件,或者您导入的私钥可能需要未安装在系统上的加密服务提供程序"

    =>如果我尝试通过在Windows资源管理器中双击导入文件(RobinDotNet的建议),也会发生同样的情况

  • Stack Overflow问题在MSBuild,Team Build和TFS中使用PFX文件签署程序集

    =>这个问题的OP也没有成功解决上述两个问题,但遗憾的是,他得到的答案甚至都没有帮助我:

    以在构建计算机上运行MSBuild的用户身份登录,手动调用MSBuild,然后在出现提示时键入密码.

    =>我登录并运行msbuild myproject.sln但它甚至不会提示我输入密码.

    最终为我修复的是制作TFS Build服务在本地计算机上运行管理员的帐户.

    =>运行Hudson(更准确地说:Tomcat)的帐户已经本地管理员.我试图从"以管理员身份运行"命令行运行MSBuild,并且仍然会收到相同的错误消息.


更新:我尝试在同一台服务器上的Visual Studio中打开解决方案并构建它.我犯了同样的错误.当我尝试在项目属性的"签名"选项卡中重新导入PFX文件时,它会告诉我"密码无效".如果我尝试在我的工作站上的Visual Studio中的同一个解决方案中导入相同的文件并提供相同的密码,则会被接受.

更新2:如果我使用Visual Studio 2008生成的旧临时密钥,可以将其成功导入到我们服务器的证书库中; 我无法导入我使用Visual Studio 2010新创建的任何临时密钥.

更新3:我能够在服务器上的Visual Studio中创建一个新的"临时密钥",并在服务器和工作站上使用它来签署ClickOnce清单.我只是无法对它做出合理的解释 - 两台计算机都是64位,我在两者上都使用Visual …

msbuild clickonce hudson code-signing jenkins

10
推荐指数
1
解决办法
9783
查看次数

SharePoint 2010是否支持iCalendar格式?

听起来像一个非常愚蠢的问题,但我尝试过,在谷歌上找到这个简单问题的简单答案并不容易.


更长的故事:

在我开始搜索之前,我只是理所当然地认为SharePoint提供了一个使用iCal访问日历的Web服务.

但在搜索之后,我担心我完全错了.我只是不想相信它.甚至在SharePoint 2010中都没有?标准出版十二年后?!

我发现了一个关于实现iCal导出的博客,但说实话,实现它干净,完整和无错误,理想情况下甚至是双向的,这只是在开始问这里之前的努力.

我还发现了一种名为MashPoint商业产品,但它太过分了.

剩下的微小希望之火让我把这个问题作为一个问题,并希望在咖啡之后,整个世界突然变得不同.

icalendar sharepoint-2010

9
推荐指数
2
解决办法
2万
查看次数