小编Dia*_*cus的帖子

最优雅的XML序列化Color结构

一个问题让我足以在Stack Overflow上注册.目前,如果我想将Color to XML string序列化为命名颜色,或者#rrggbb,或者#aarrggbb,我这样做:

[XmlIgnore()]
public Color color;

[XmlElement(ElementName = "Color")]
public String color_XmlSurrogate
{
  get { return MyColorConverter.SetColor(color); }
  set { color = MyColorConverter.GetColor(value); }
}
Run Code Online (Sandbox Code Playgroud)

MyColorConverter是按照我喜欢的方式进行序列化.但所有这一切感觉就像一个kludge,有额外的领域和所有.有没有办法让它在更少的行中工作,可能将TypeDescriptor与与XML相关的C#属性连接起来?

c# xml-serialization

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

在C#中使用BouncyCastle构建证书链

我有一堆作为字节数组给出的根证书和中间证书,我也有最终用户证书.我想为给定的最终用户证书构建证书链.在.NET框架中,我可以这样做:

using System.Security.Cryptography.X509Certificates;

static IEnumerable<X509ChainElement>
    BuildCertificateChain(byte[] primaryCertificate, IEnumerable<byte[]> additionalCertificates)
{
    X509Chain chain = new X509Chain();
    foreach (var cert in additionalCertificates.Select(x => new X509Certificate2(x)))
    {
        chain.ChainPolicy.ExtraStore.Add(cert);
    }

    // You can alter how the chain is built/validated.
    chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreWrongUsage;

    // Do the preliminary validation.
    var primaryCert = new X509Certificate2(primaryCertificate);
    if (!chain.Build(primaryCert))
        throw new Exception("Unable to build certificate chain");

    return chain.ChainElements.Cast<X509ChainElement>();
}
Run Code Online (Sandbox Code Playgroud)

如何在BouncyCastle中做到这一点?我试过下面的代码,但我得到PkixCertPathBuilderException: No certificate found matching targetContraints:

using Org.BouncyCastle;
using Org.BouncyCastle.Pkix;
using Org.BouncyCastle.Utilities.Collections;
using Org.BouncyCastle.X509;
using …
Run Code Online (Sandbox Code Playgroud)

c# bouncycastle

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

将队列设计为共享内存

我正在尝试将(循环)队列(在C中)设计/实现为共享内存,以便它可以在多个线程/进程之间共享.

队列结构如下:

typedef struct _q {
    int q_size;
    int q_front;
    int q_rear;
    int *q_data;
}queue;
Run Code Online (Sandbox Code Playgroud)

它支持以下功能:

int empty_q(queue *q);
int display_q(queue *q);
int create_q(queue **q, int size);
int delete_q(queue **q);
int enqueue(queue *q, int data);
int dequeue(queue *q, int *data);
Run Code Online (Sandbox Code Playgroud)

根据用户提到的队列大小,q_data的内存将在create_q()中分配.

问题:如何使用"sys/shm.h"中提供的系统函数为此队列创建共享内存?用于创建/附接/检索/删除使用共享存储器用于队列数据结构中的任何的代码段/示例shmget的(),的shmat(),了shmctl()等将是一个很大的帮助.

c memory posix shared-memory

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

在Windows服务中以低于正常优先级停止Parallel.ForEach

Parallel.ForEach我的Windows服务中有代码.如果ParallelOptions.MaxDegreeOfParallelism设置为-1,我正在使用我的大部分CPU.然而,停止服务持续半分钟.应该接收服务应该停止的信号的某些内部控制器线程会超出处理器时间.我将进程优先级设置为低于正常值,但这可能是不相关的信息.

即使所有线程都忙,我还能做些什么来缩短停止服务的时间?

我正在试图暂时降低线程池中线程的优先级,因为我没有任何异步代码,但Internet说这是一个坏主意,所以在这里要求"正确"的方式.

螺纹(包括操作系统和.NET)在所有情况下之间的不同OnStartOnStop.此外,如果停止时间非常长,那么OnStop有时最终将调用的OS线程是一个新线程,而不是在日志中更早显示.

要构建此代码,请创建新的Windows服务项目,从设计器添加ProjectInstaller类,将Account更改为LocalService,然后使用InstallUtil安装一次.确保LocalService可以写入C:\ Temp.

public partial class Service1 : ServiceBase
{
    private ManualResetEvent stopEvent = new ManualResetEvent(false);
    private Task mainTask;
    private StreamWriter writer = File.AppendText(@"C:\Temp\Log.txt");

    public Service1()
    {
        InitializeComponent();

        writer.AutoFlush = true;
    }

    protected override void OnStart(string[] args)
    {
        Log("--------------");
        Log("OnStart");

        mainTask = Task.Run(new Action(Run));
    }

    protected override void OnStop()
    {
        Log("OnStop");
        stopEvent.Set();

        mainTask.Wait();
        Log("--------------");
    }

    private void Log(string line)
    {
        writer.WriteLine(String.Format("{0:yyyy-MM-dd HH:mm:ss.fff}: [{1,2}] {2}",
            DateTime.Now, Thread.CurrentThread.ManagedThreadId, line));
    } …
Run Code Online (Sandbox Code Playgroud)

c# windows-services task-parallel-library

9
推荐指数
1
解决办法
590
查看次数

#define从C转换为C#

这是C代码:

/* LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0 */
#define LERP(a,b,c)     (((b) - (a)) * (c) + (a))
Run Code Online (Sandbox Code Playgroud)

http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_T.html

等于这个C#代码?

private static double LERP(double a, double b, double c) { return (((b) - (a)) * (c) + (a)); }
Run Code Online (Sandbox Code Playgroud)

c c# macros

8
推荐指数
3
解决办法
1268
查看次数

在WiX中静默安装根证书

如何从WiX静默安装根证书?我正在安装一些根证书和中间证书,对于根证书,系统会显示确认对话框,显示基本证书属性和指纹.这是我的相关代码,使用WixIIsExtension映射在命名空间中iis:

<Binary Id="RootCa" SourceFile="Certificates\RootCa.cer" />

<DirectoryRef Id="TARGETDIR">
  <Component Id="RootCa" Guid="...">
    <iis:Certificate
      Id="RootCa"
      BinaryKey="RootCa"
      Name="RootCa"
      StoreLocation="currentUser"
      StoreName="root"/>
  </Component>
</DirectoryRef>

<Feature ...>
    <ComponentRef Id="RootCa" />
</Feature>
Run Code Online (Sandbox Code Playgroud)

wix

8
推荐指数
2
解决办法
7927
查看次数

Visual Studio 2010"按任意键继续..." 不显示

"按任意键继续"当我的应用程序完成执行时,措辞不会显示在控制台中.

我知道这个提示应该在"start without debugging"模式下显示,但事实并非如此!只要我输入任何参数并按Enter键,控制台窗口就会关闭而不显示输出...

我该怎么做才能让控制台应用程序在完成执行时提示我输入任何密钥?

c++ visual-studio-2010

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

如何在Linux中为内存映射文件提供扩展写入功能?

我正在努力将一些代码从AIX移植到Linux.部分代码使用shmat()系统调用来创建新文件.当SHM_MAP在可写模式下使用时,可以将文件扩展到其原始长度之外(在我的情况下为零):

将文件映射到段时,通过访问段来引用该文件.内存分页系统自动处理物理I/O. 超出文件末尾的引用会导致文件以页面大小的增量进行扩展.文件无法扩展到下一个段边界之外.

(AIX中的"段"是256 MB的地址空间块,"页面"通常是4 KB.)

我会在Linux上做的是以下几点:

  • 保留一大块地址空间(它不必大到256 MB,这些不是很大的文件)
  • 设置页面保护位,以便在首次访问之前未触及的页面时生成段错误
  • 在页面错误时,清除"导致页面错误"位并为页面分配已提交的内存,允许导致页面错误的写入(或读取)继续
  • 关闭共享内存区域后,将修改后的页面写入文件

我知道我可以在Windows上使用VirtualProtect函数,PAGE_GUARD内存保护位和结构化异常处理程序执行此操作.Linux上相应的方法是做什么的呢?是否有更好的方法在Linux上实现这种写入扩展功能?

我已经考虑过:

  • 使用mmap()一些固定的大尺寸,但我无法分辨应用程序代码写入了多少文件
  • 分配一个大小的匿名共享内存区域,但我再也无法分辨出已写入多少区域
  • mmap() 本身似乎没有提供任何延长支持文件长度的工具

当然,我只想对应用程序代码进行最小的更改即可.

linux aix posix

5
推荐指数
1
解决办法
2991
查看次数

为C++ DLL实现回调C#函数

我正在为我的C++库编写一个DLL包装器,从C#调用.此包装器还应具有从库调用并在C#中实现的回调函数.这些函数例如将std :: vector <unsigned char>作为输出参数.我不知道如何做到这一点.如何通过回调函数将未知大小的缓冲区从C#传递到C++?

我们来看看这个例子吧

CallbackFunction FunctionImplementedInCSharp;

void FunctionCalledFromLib(const std::vector<unsigned char>& input, std::vector<unsigned char>& output)
{
    // Here FunctionImplementedInCSharp (C# delegate) should somehow be called
}

void RegisterFunction(CallbackFunction f)
{
    FunctionImplementedInCSharp = f;
}
Run Code Online (Sandbox Code Playgroud)

应该如何 CallbackFunction定义以及FunctionCalledFromLib中的代码是什么?

愚蠢的一件事是:如何在C++代码中删除C#创建的缓冲区?

c# c++ interop

4
推荐指数
2
解决办法
9271
查看次数

shmat()为同一个"shmkey"返回一个不同的"shmaddr"

这是我的设置......

/* Bounded Buffer item structure */
struct item {
    int  id;  /* string index value */
    char str[80];  /* string value */
};

/* Structure for the shared memory region */
typedef struct {
    int    debug;           /* debug flag */
    int    in;              /* index of next empty slot */    
    int    out;             /* index of next full slot  */
    char   MUTEXname[32];   /* name of the MUTEX semaphore */
    char   EMPTYname[32];   /* name of the EMPTY semaphore */
    char   FULLname[32];    /* …
Run Code Online (Sandbox Code Playgroud)

c posix producer-consumer shared-memory

3
推荐指数
1
解决办法
3063
查看次数