Tag: C#的

dependency injection和命名logging器

我有兴趣进一步了解人们如何使用dependency injection平台来注入日志。 尽pipe下面的链接和我的示例都提到了log4net和Unity,但我不一定会使用这两者中的任何一个。 对于dependency injection/ IOC,我可能会使用MEF,因为这是项目其他部分(大)正在解决的标准。 我对dependency injection/ ioc非常陌生,对于C#和.NET来说很新颖(在VC6和VB6的过去10多年中,在C#/ .NET中写了很less的生产代码)。 我已经做了很多调查,在那里的各种日志logging解决scheme,所以我认为我有一个体面的处理他们的function集。 我只是不太熟悉,用实际的机制来获得一个dependency injection(或者,也许更“正确”,得到一个注入的dependency injection的抽象版本)。 我已经看到其他与日志和/或dependency injection相关的post,如: dependency injection和日志接口 logging最佳实践 Log4Net Wrapper类是什么样的? 再次关于log4net和Unity IOCconfiguration 我的问题没有具体与“如何使用ioc工具yyy注入日志logging平台xxx”? 相反,我感兴趣的是人们如何处理包装日志平台(通常,但并不总是推荐)和configuration(即app.config)。 例如,以log4net为例,我可以configuration(在app.config中)一些logging器,然后以这样的代码的标准方式获得这些logging器(没有dependency injection): private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 另外,如果我的logging器不是为一个类命名的,而是一个function区域,我可以这样做: private static readonly ILog logger = LogManager.GetLogger("Login"); private static readonly ILog logger = LogManager.GetLogger("Query"); private static readonly ILog logger = […]

什么是使用ArraySegment <T>类?

我只是在子类化MessageEncoder类的时候碰到了ArraySegment<byte>types。 我现在明白,它是给定数组的一部分,需要一个偏移量,不是可枚举的,也没有索引器,但是我仍然无法理解它的用法。 有人可以请示例解释吗?

是否unique_ptr保证移动后存储nullptr?

是否unique_ptr保证移动后存储nullptr ? std::unique_ptr<int> p1{new int{23}}; std::unique_ptr<int> p2{std::move(p1)}; assert(!p1); // is this always true?

当我设置IIS池的LoadUserProfile时究竟发生了什么?

我遇到了以下问题。 我运行下面的代码 var binaryData = File.ReadAllBytes(pathToPfxFile); var cert = new X509Certificate2(binaryData, password); 在两个过程中。 其中一个进程在LOCAL_SYSTEM下运行,并且代码成功。 另一个运行在属于“用户”本地组的本地用户帐户下的IIS,在那里我得到以下exception: System.Security.Cryptography.CryptographicException Object was not found. at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags) at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password) //my code here 所以我Googlesearch了一下,发现了一个类似的问题的答案 。 我试图为应用程序池启用LoadUserProfile ,现在它工作。 问题是当我设置LoadUserProfile时会发生什么,以及可能会产生什么后果。 我的意思是,如果这是一个“好”的东西,那么为什么它不是默认的“开”,为什么它在那里呢? […]

如何用lambdasorting?

sort(mMyClassVector.begin(), mMyClassVector.end(), [](const MyClass & a, const MyClass & b) { return a.mProperty > b.mProperty; }); 我想使用lambda函数来sorting自定义类,而不是绑定实例方法。 但是,上面的代码产生错误: 错误C2564:'const char *':一个函数式转换为内置types只能带一个参数 它适用于boost::bind(&MyApp::myMethod, this, _1, _2) 。

快速获取特定path中的所有文件和目录

我正在创build一个c#扫描目录的备份应用程序。 在我使用这样的东西之前,为了获取目录中的所有文件和子文件: DirectoryInfo di = new DirectoryInfo("A:\\"); var directories= di.GetFiles("*", SearchOption.AllDirectories); foreach (FileInfo d in directories) { //Add files to a list so that later they can be compared to see if each file // needs to be copid or not } 唯一的问题是,有时一个文件无法访问,我得到了几个错误。 我得到一个错误的例子是: 因此,我创build了一个recursion方法,将扫描当前目录中的所有文件。 如果那个目录中有目录,那么该方法将被再次调用,通过该目录。 关于这个方法的好处是,我可以把文件放在一个try catch块中,让我可以select将这些文件添加到List,如果没有错误,并且如果我有错误,将目录添加到另一个列表。 try { files = di.GetFiles(searchPattern, SearchOption.TopDirectoryOnly); } […]

这个C程序如何编译和运行两个主要function?

今天,在一个定制库的同时,我发现了一个奇怪的行为。 一个静态库代码包含一个debuggingmain()函数。 它不在#define标志内。 所以它也存在于图书馆里。 它被用来链接到另一个包含真正main() 。 当它们都链接在一起时,链接器没有为main()抛出多重声明错误。 我想知道这是怎么发生的。 为了简单起见,我创build了一个模拟相同行为的示例程序: $ cat prog.c #include <stdio.h> int main() { printf("Main in prog.c\n"); } $ cat static.c #include <stdio.h> int main() { printf("Main in static.c\n"); } $ gcc -c static.c $ ar rcs libstatic.a static.o $ gcc prog.c -L. -lstatic -o 2main $ gcc -L. -lstatic -o 1main […]

这是std :: ref行为逻辑?

考虑这个代码: #include <iostream> #include <functional> int xx = 7; template<class T> void f1(T arg) { arg += xx; } template<class T> void f2(T arg) { arg = xx; } int main() { int j; j=100; f1(std::ref(j)); std::cout << j << std::endl; j=100; f2(std::ref(j)); std::cout << j << std::endl; } 执行时,输出此代码 107 100 我预料第二个值是7而不是100。 我错过了什么?

为什么OpenMP不允许使用!=运算符?

我试图编译下面的代码: #pragma omp parallel shared (j) { #pragma omp for schedule(dynamic) for(i = 0; i != j; i++) { // do something } } 我得到这个错误: 错误:无效的控制谓词 。 我检查了openMP 参考指南 ,它说并行为“only”允许以下操作符之一:<=>> =。 我不明白为什么不让i != j 。 我可以理解,如果这是静态的时间表,因为openMP需要预先计算分配给每个线程的迭代次数。 但我不明白为什么这种限制在这种情况下,例如。 任何线索? 编辑:即使我作出for(i = 0; i != 100; i++) ,虽然我可以把“<”或“<=”。

为什么编译器匹配“char”到“int”而不是“short”?

我有一个小程序: #include<iostream> using namespace std; void f(int) { cout << "int\n"; } void f(short) { cout << "short\n"; } int main(void){ char c = 0; f(c); return 0; } 它打印int 。 我觉得,如果这是因为“整数推广”,为什么不是short优先? 我也知道整数提升发生在一个expression式(如A = B)。 但是我没有expressionf(),调用f(),对吧? 如果这与重载parsing规则有关,为什么传递char到f会导致编译器宁愿int short ? 如果我删除f(int) ,那么f(c)将调用f(short) ! 所以总的来说,我的问题是,它与“整数提升”还是“超载parsing规则”有关? 为什么?