消息总线[1]和消息代理[2]之间的区别是什么
正如我所看到的,唯一相关的区别是用来代表每一个的图片.
如果之间存在一些差异,请告诉我什么.
如果它们是相同的,请告诉我为什么两个概念引用相同的功能.
谢谢.
[1] http://www.eaipatterns.com/MessageBus.html
[2] http://www.eaipatterns.com/MessageBroker.html
尝试将某些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删除空元素进行预先解密?
还是
更好的方式?
除了最常见的调用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时,下面是否发生了什么?
谢谢
我有一个非托管的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#)带入一个用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的错误还是我应该做些不同的事情?
我有一个带有Windows服务的exe文件.要安装它,我使用命令:
installutil myService.exe/ShowCallStack
然后,我可以在"服务"窗口中看到"service1".
我的问题是,是否可以安装2个相同服务的实例(使用相同的exe)但名称不同.我想在不更改源代码的情况下这样做.
谢谢
考虑以下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.
而不是这个,我得到一个异常,告诉文档有错误.
我正在使用带有以下参数的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创建证书,它对我来说也是一个有效的答案.
众所周知,在"调试模式"(而不是"发布模式")下编译程序可能会导致性能下降.
但有时候获得一些调试信息会很有用.例如,当我们的程序在生产服务器上运行并发生异常时,有助于在异常时记录堆栈跟踪.
我发现这是可能的,在"发布模式"中编译代码并将*.pdb文件与二进制文件放在同一文件夹中.
任何人都知道附加pdb文件是否会导致任何性能问题.
谢谢
可以编写一个Java程序来读取存储在Windows证书库中的一个证书(获取私钥和公钥)吗?
谢谢
c# ×4
.net ×2
encryption ×2
pinvoke ×2
cryptography ×1
debugging ×1
eai ×1
integration ×1
java ×1
makecert ×1
marshalling ×1
messaging ×1
openssl ×1
routing ×1
rsa ×1
security ×1
windows ×1
xml ×1