小编Zé *_*los的帖子

消息总线和消息代理之间的区别

消息总线[1]和消息代理[2]之间的区别是什么

  • 两者都是应用程序的中间件
  • 两者都可用于解耦各种系统
  • 两者都可以具有规范数据模型
  • 两条路由消息都可以提供其他功能,例如数据转换

正如我所看到的,唯一相关的区别是用来代表每一个的图片.

如果之间存在一些差异,请告诉我什么.
如果它们是相同的,请告诉我为什么两个概念引用相同的功能.

谢谢.

[1] http://www.eaipatterns.com/MessageBus.html
[2] http://www.eaipatterns.com/MessageBroker.html

integration messaging routing eai

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

在C#中使用空元素反序列化Xml

尝试将某些xml snippit从供应商反序列化为对象.问题是我在每个empy元素标签上获得的格式无效.当所有元素都有值时,我可以反复排序对象没问题.或者省略空元素.

Xml Snippit:

<foo>
<propOne> 1 </ propOne>
<propTwo />
</ foo>

C#类:

[Serialilbe()]     
public class foo
{ 
   public foo(){}
   [XmlElementAttribute(IsNullable = true)]
   public int? propOne {get;set;} 
   [XmlElementAttribute(IsNullable = true)]
   public int? propTwo {get;set;}   
 }
Run Code Online (Sandbox Code Playgroud)

我可以通过类来设置调整解析吗?
或者
有一种简单的方法我可以应用xsl来删除这些元素吗?
或者
我应该使用regEx删除空元素进行预先解密?
还是
更好的方式?

c# xml serialization

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

为什么要将取消令牌传递给TaskFactory.StartNew?

除了最常见的调用TaskFactory.StartNew的形式,只有"action"参数(1)https://msdn.microsoft.com/en-us/library/dd321439 ( v= vs.110).aspx

我们还有一种方法可以接受额外的参数作为"取消令牌"(2)https://msdn.microsoft.com/en-us/library/dd988458.aspx

我的问题是,我们为什么要使用call(2)而不是call(1)?

我的意思是,如果我没有将取消令牌作为参数传递(因为可以从委托函数访问变量令牌),页面(2)的MSDN中的示例也可以工作.例如:

var tokenSource = new CancellationTokenSource();
      var token = tokenSource.Token;
      var files = new List<Tuple<string, string, long, DateTime>>();

      var t = Task.Factory.StartNew( () => { string dir = "C:\\Windows\\System32\\";
                                object obj = new Object();
                                if (Directory.Exists(dir)) {
                                   Parallel.ForEach(Directory.GetFiles(dir),
                                   f => {
                                           if (token.IsCancellationRequested)
                                              token.ThrowIfCancellationRequested();
                                           var fi = new FileInfo(f);
                                           lock(obj) {
                                              files.Add(Tuple.Create(fi.Name, fi.DirectoryName, fi.Length, fi.LastWriteTimeUtc));          
                                           }
                                      });
                                 }
                              }
                        ); //note that I removed the ", token" from here
      tokenSource.Cancel();
Run Code Online (Sandbox Code Playgroud)

当我将取消令牌传递给Task.Factory.StartNew时,下面是否发生了什么?

谢谢

c# task-parallel-library

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

将指针从非托管代码返回到托管代码

我有一个非托管的DLL导出以下函数:

SomeData* test();
Run Code Online (Sandbox Code Playgroud)

我们假设SomeData为:

typedef struct _Data Data;  
struct _Data{  
    int a;  
    int b;  
}
Run Code Online (Sandbox Code Playgroud)

现在我想用C#代码调用这个函数.我开始定义像这样自定义编组所需的C#Struture:

[StructLayout(LayoutKind.Sequential)]  
public class SomeData  
{  
    public Int32 a;  
    public Int32 b;  
}  
Run Code Online (Sandbox Code Playgroud)

现在,我宣布托管函数:

[DllImport("DynamicLibrary.dll", CharSet=CharSet.Auto)]  
[return: MarshalAs(UnmanagedType.LPStruct)]  
public static extern SomeData test();  
Run Code Online (Sandbox Code Playgroud)

在主要功能我有:

IntPtr ptr = test();  
Run Code Online (Sandbox Code Playgroud)

这样做,我得到MarchalDirectiveException:"无法编组'返回值':无效的托管/非托管类型组合(Int/UInt必须与SysInt或SysUInt配对)."

我没有为C#中的SomeData分配内存,因为我希望这个内存在C函数中分配,我将使用Marshal.Copy将它传递给托管内存.

有任何想法吗?谢谢

------------------------ JaredPar ANSWER之后的编辑--------------------

事实上,我在将代码复制到我的问题时犯了一个错误.我使用的真正托管签名是:

[DllImport("DynamicLibrary.dll",CharSet = CharSet.Auto)]
[返回:MarshalAs(UnmanagedType.LPStruct)]
public static extern IntPtr test();

JaredPar的答案仍然相关.为了获得正确的行为,我有两个选择:

1)使用'public static extern IntPtr test();' (没有MarshalAs属性)签名然后像JaredPar建议的那样访问返回的指针.

2)使用'public static extern SomeData test();' (使用MarshalAs属性)然后只需使用SomeData sd = test();

c# pinvoke marshalling

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

使用PInvoke从C#读取带有"union"类型的C结构

我正试图将管理端(C#)带入一个用C语言构建的结构.

我们假设这个结构(C代码):

typedef struct S{
    int i;
    union{
        TypeA a;
        TypeB b;
        TypeC c;
    }uni;
 } S;  
Run Code Online (Sandbox Code Playgroud)

现在,我创建了C#包装类:

[StructLayout(LayoutKind.Explicit)]
public class S
{
    [FieldOffset(0)] 
    public int i;
    [FieldOffset(4)] 
    public TypeA a;
    [FieldOffset(4)]
    public TypeB b;
    [FieldOffset(4)]
    public TypeC c;
}
Run Code Online (Sandbox Code Playgroud)

我有一个PInvoke方法来获取S对象:
(C的实现在union字段中创建并返回一个带有TypeA的S结构)

[DllImport("Library.dll", CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.S)]
public static extern S getUnionStruct();
Run Code Online (Sandbox Code Playgroud)

在主要功能的某处,我做:

S s = getUnionStruct();
Console.WriteLine("unions type: {0}",(S.a).GetType());
Run Code Online (Sandbox Code Playgroud)

结果是"AssembleName.TypeC"(???)

.net Framework假设TypeC,因为那是最后声明的.我还注意到,如果TypeC的大小小于TypeA,我将无法读取所有TypeA字段.

这是来自.net的错误还是我应该做些不同的事情?

.net pinvoke

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

使用自定义名称安装Windows服务

我有一个带有Windows服务的exe文件.要安装它,我使用命令:

installutil myService.exe/ShowCallStack

然后,我可以在"服务"窗口中看到"service1".

我的问题是,是否可以安装2个相同服务的实例(使用相同的exe)但名称不同.我想在不更改源代码的情况下这样做.

谢谢

windows windows-services

6
推荐指数
1
解决办法
3996
查看次数

使用空元素反序列化Xml

考虑以下XML:

<a>
    <b>2</b>
    <c></c>
</a>  
Run Code Online (Sandbox Code Playgroud)

我需要将这个xml反序列化为一个对象.所以,我写了下面的课.

public class A
{
    [XmlElement("b", Namespace = "")]
    public int? B { get; set; }

    [XmlElement("c", Namespace = "")]
    public int? C { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

因为我正在使用nullables,所以我期待在解析上面的xml时,我会得到一个带有null C属性的对象A.

而不是这个,我得到一个异常,告诉文档有错误.

c# xml-deserialization deserialization

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

使用openssl/makecert工具创建x509证书

我正在使用带有以下参数的makecert创建x509证书:

makecert -r -pe -n"CN = Client"-ss MyApp

我想使用此证书使用RSA算法加密和解密数据.我期待在Windows证书库中生成证书,一切似乎都好(它有一个私钥,公钥是一个1024位的RSA密钥等等)

现在我使用这个C#代码来加密数据:

X509Store store = new X509Store("MyApp", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Client", false);
X509Certificate2 _x509 = certs[0];

using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_x509.PublicKey.Key)
{
    byte[] dataToEncrypt = Encoding.UTF8.GetBytes("hello");
    _encryptedData = rsa.Encrypt(dataToEncrypt, true);
}
Run Code Online (Sandbox Code Playgroud)

执行Encrypt方法时,我收到带有消息"Bad key"的CryptographicException.

我认为代码很好.可能我没有正确创建证书.任何意见?谢谢

----------------编辑--------------
如果有人知道如何使用OpenSsl创建证书,它对我来说也是一个有效的答案.

security encryption openssl rsa makecert

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

.NET:运行带有调试信息的程序

众所周知,在"调试模式"(而不是"发布模式")下编译程序可能会导致性能下降.

但有时候获得一些调试信息会很有用.例如,当我们的程序在生产服务器上运行并发生异常时,有助于在异常时记录堆栈跟踪.

我发现这是可能的,在"发布模式"中编译代码并将*.pdb文件与二进制文件放在同一文件夹中.

任何人都知道附加pdb文件是否会导致任何性能问题.

谢谢

.net compiler-construction debugging

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

Java:从Windows应用商店读取证书

可以编写一个Java程序来读取存储在Windows证书库中的一个证书(获取私钥和​​公钥)吗?

谢谢

java encryption cryptography x509certificate

4
推荐指数
1
解决办法
5601
查看次数