Tag: .net

log4net的logger包装器的实现和使用

这个问题与史蒂文的答案有关 – 这里 。 他提出了一个非常好的记录器包装器。 我将在下面粘贴他的代码: public interface ILogger { void Log(LogEntry entry); } public static class LoggerExtensions { public static void Log(this ILogger logger, string message) { logger.Log(new LogEntry(LoggingEventType.Information, message, null)); } public static void Log(this ILogger logger, Exception exception) { logger.Log(new LogEntry(LoggingEventType.Error, exception.Message, exception)); } // More methods here. } 所以,我的问题是创建代理到log4net的实现的正确方法是什么 ? 我应该只使用类型参数添加另一个Log扩展方法,然后在里面创建一个开关吗? […]

调用线程无法访问此对象,因为另一个线程拥有它(async / await / task)

我正在使用async / await等将一些长时间运行的代码移动到后台,但是遇到了主题行错误。 我很清楚我无法从任务更新我的WPF UI控件(我已经适当地添加了调度程序)但是这个错误只是更新了我的类中的对象。 例: private WriteableBitmap TempImage; public async void StartProcessing() { WriteableBitmap LoadedImage = new WriteableBitmap(await LoadImage(0)); //ERROR HERE LoadedImage.Freeze(); TempImage = LoadedImage; // do more stuff } private Task LoadImage(int imageIndex) { return Task.Run(() => { FileStream fileStream = new FileStream(fileList[0], FileMode.Open, FileAccess.Read); var img = new BitmapImage(); img.BeginInit(); img.StreamSource = […]

C#中的“>>”运算符有什么作用?

我在一段代码中遇到了这个声明: Int32 medianIndex = colorList.Count >> 1; colorList是System.Drawing.Color类的列表。 现在声明应该检索列表的中间索引..就像它的半点..但我无法理解>>符号如何工作以及“1”应该如何给出中间索引..我会感激一些帮助:S

从Web下载之前获取图像文件的大小

我正在使用控制台应用程序中的以下代码从Web下载图像文件。 WebClient client = new WebClient(); client.DownloadFile(string address_of_image_file,string filename); 代码运行得非常好。 我想知道是否有一种方法可以在下载之前获得此图像文件的大小。 PS-实际上我已经编写了代码来制作一个爬行器,它可以在站点下载图像文件。 所以我事先并不知道它的大小。 我所拥有的只是从网页源中提取的文件的完整路径。

即使所有项目都引用4.3.1,.NET运行时也会尝试加载FSharp.Core 4.3.0

我在F#中创建了一个针对F#3.1运行时的项目(即FSharp.Core版本4.3.1)。 然后我创建了一个控制台C#应用程序,为我的F#项目添加了项目引用,添加了对FSharp.Core.dll 4.3.1的引用。 一切都编译没有任何错误或警告,但运行时抛出这个当我尝试使用F#项目中的任何类型时: System.IO.FileLoadException : Could not load file or assembly ‘FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. 当我的所有项目都参考4.3.1时,为什么它会搜索FSharp.Core 4.3.0? 如果我将所有项目引用从4.3.1更改为4.3.0,那么一切都会正常工作,但是版本4.3.1是什么? PS两个项目都针对.NET 4.5.1。 我正在使用Microsoft Visual Studio 2013

WPF – 集合中属性的OnPropertyChanged

在视图模型中,我有一个名为“ClassA”的项目集合,称为“MyCollection”。 ClassA有一个名为“IsEnabled”的属性。 class MyViewModel { List MyCollection { get; set; } class ClassA { public bool IsEnabled { get; set; } } } 我的视图有一个绑定到MyCollection的数据网格。 每行都有一个按钮,其“IsEnabled”属性绑定到ClassA的IsEnabled属性。 当视图模型中的条件发生更改以使MyCollction列表中的某个特定项需要禁用时,我将IsEnabled属性设置为false: MyCollection[2].IsEnabled = false; 我现在想要通过OnPropertyChanged事件通知此更改的视图,但我不知道如何引用集合中的特定项目。 OnPropertyChanged(“MyCollection”); OnPropertyChanged(“MyCollection[2].IsEnabled”); 两者都不起作用。 如何通知查看此更改? 谢谢!

iTextSharp重复使用Acrofield中嵌入的字体

“iText In Action”中有一些提示,包括设置字体,以及“FontFactory.RegisterDirectories”方法(正如书中所说的那样……一个昂贵的调用)。 但是,就我而言,我想用于新字段的字体已经嵌入到文档中(在现有的Acrofield中)。 不能保证在用户的机器上(或在Web服务器上)存在相同的字体….有没有办法可以注册已经嵌入的字体,以便我可以将它重新用于其他对象? 在下面的代码中,Acrofield“TheFieldIWantTheFontFrom”具有我想要为名为“my_new_field”的字段重用的字体。 任何帮助将不胜感激! using (MemoryStream output = new MemoryStream()) { // Use iTextSharp PDF Reader, to get the fields and send to the //Stamper to set the fields in the document PdfReader pdfReader = new PdfReader(@”C:\MadScience\MSE_030414.pdf”); // Initialize Stamper (ms is a MemoryStream object) PdfStamper pdfStamper = new PdfStamper(pdfReader, output); // […]

在外部文件中编写appSettings

我有一个配置文件app.exe.config和appSettings部分有这样的: app.file.config文件有这样的东西: 我需要在运行时编辑var1,var2和var3,我有这样的代码: Configuration config = ConfigurationManager.OpenExeConfiguration(“…path\app.exe); config.AppSettings.SectionInformation.ConfigSource = “app.file.config”; config.AppSettings.Settings[“var1”].Value = “value 11”; config.AppSettings.Settings[“var2”].Value = “value 22”; config.AppSettings.Settings[“var3”].Value = “value 33”; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection(“appSettings”); 当我运行config.Save ….文件app.file.config有一个appSettings节点,其属性为“file”。 此属性具有app.file.config的值 现在,如果我尝试加载配置文件,我有一个例外,消息“无法识别的属性’文件’。请注意,属性名称区分大小写。” 在app.file.config中。 如果手动删除文件属性,则会正确加载配置文件。 有任何想法吗? 保存配置文件时如何避免写入文件属性。 谢谢

WebBrowserSite:如何在派生类中调用私有COM接口方法?

这是挑战。 我是从Framework的WebBrowserSite类派生出来的。 我的派生类ImprovedWebBrowserSite一个实例是通过WebBrowser.CreateWebBrowserSiteBase返回的,我在WebBrowser类的派生版本中覆盖了它 – 专门用于提供自定义站点对象。 Framework的WebBrowser实现进一步将其传递给底层的非托管WebBrowser ActiveX控件。 到目前为止,我已经设法在我的ImprovedWebBrowserSite实现中覆盖IDocHostUIHandler (像这样 )。 我现在正在寻找更多的核心COM接口,比如IOleClientSite ,我想将它传递给WebBrowserSite 。 所有这些都通过ComImport暴露给COM,但是通过Framework的WebBrowserSite / UnsafeNativeMethods实现声明为private或internal 。 因此,我无法在派生类中明确地重新实现它们。 我必须定义自己的版本,就像我使用IDocHostUIHandler 。 所以,问题是,如何从我的派生类中调用WebBrowserSite定义的私有或内部COM接口的方法? 例如,我想调用IOleClientSite.GetContainer 。 我可以使用reflection(像这样 ),但这将是最后的手段,其次是从头开始重新实现WebBrowser 。 我的想法是,因为Framework的私有UnsafeNativeMethods.IOleClientSite和我自己的ImprovedWebBrowserSite.IOleClientSite都是COM接口,使用ComImport属性声明,相同的GUID和相同的方法签名。 .NET 4.0+中有COM类型等价 ,因此必须有一种方法可以在没有reflection的情况下完成。 [更新]现在我已经有了解决方案 ,我相信它为自定义WebBrowser控件的WinForms版本打开了一些新的和有趣的可能性。 这个版本的问题是在我最初尝试以更抽象的forms提出问题之后创建的,被评论员称为误导。 评论已被删除,但我决定保留这两个版本。 为什么我不想用reflection来解决这个问题? 原因如下: 依赖于内部或私有方法的实际符号名称,由WebBrowserSite的实现者给出,与COM接口不同,后者是关于二进制v表合同。 庞大的reflection代码。 例如,考虑通过Type.InvokeMember调用base的私有TranslateAccelerator ,我有大约20个这样的方法来调用。 虽然不太重要,但效率:通过reflection的后期绑定调用总是比通过v-table直接调用COM接口方法效率低。

使用正则表达式替换引号外的空格

使用C#,我需要使用LIKE命令准备一个搜索文本,以便在SQL Server数据库中进行搜索,方法是用%字符替换引号外的所有空格。 例: 输入: my “search text” 输出: %my%search text% 任何帮助,将不胜感激。 在替换文本之前,我可以处理具有奇数引号的输入字符串。