我知道它%0
包含批处理脚本的完整路径,例如c:\path\to\my\file\abc.bat
我愿意path
等于c:\path\to\my\file
我怎么能实现这一目标?
UPDATE
从C#6开始,这个问题的答案是:
SomeEvent?.Invoke(this, e);
Run Code Online (Sandbox Code Playgroud)
我经常听到/阅读以下建议:
在检查事件之前,请务必复制事件null
并将其触发.这将消除线程的潜在问题,其中事件变为null
位于您检查null和触发事件的位置之间的位置:
// Copy the event delegate before checking/calling
EventHandler copy = TheEvent;
if (copy != null)
copy(this, EventArgs.Empty); // Call any handlers on the copied list
Run Code Online (Sandbox Code Playgroud)
更新:我从阅读中了解到这可能还需要事件成员的优化,但Jon Skeet在他的回答中指出CLR不会优化副本.
但同时,为了解决这个问题,另一个线程必须做到这样的事情:
// Better delist from event - don't want our handler called from now on:
otherObject.TheEvent -= OnTheEvent;
// Good, now we can be certain that OnTheEvent will not run...
Run Code Online (Sandbox Code Playgroud)
实际的顺序可能是这种混合物:
// Copy the event delegate before checking/calling
EventHandler copy …
Run Code Online (Sandbox Code Playgroud) 以下是可以的:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
Run Code Online (Sandbox Code Playgroud)
该finally
块在整个执行完毕后运行(IEnumerator<T>
支持IDisposable
提供一种方法来确保即使枚举在完成之前被放弃).
但这不是好事:
try
{
Console.WriteLine("Before");
yield return 1; // error CS1626: Cannot yield a value in the body of a try block with a catch clause
Console.WriteLine("After");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Run Code Online (Sandbox Code Playgroud)
假设(为了参数)WriteLine
try块中的一个或另一个调用抛出异常.在catch
块中继续执行有什么问题?
当然,收益率回报部分(目前)无法抛出任何东西,但是为什么要阻止我们封闭try
/ catch
处理在之前或之后抛出的异常yield return
?
更新:Eric Lippert在这里有一个有趣的评论 - 似乎他们已经有足够的问题正确实现try/finally行为!
编辑:此错误的MSDN页面是:http://msdn.microsoft.com/en-us/library/cs1x15az.aspx.但这并没有解释为什么.
在套接字编程中,您创建一个侦听套接字,然后对于每个连接的客户端,您将获得一个可用于处理客户端请求的普通流套接字.OS管理幕后传入连接的队列.
两个进程无法同时绑定到同一个端口 - 默认情况下,无论如何.
我想知道是否有一种方法(在任何着名的操作系统,特别是Windows上)启动进程的多个实例,这样它们都绑定到套接字,因此它们有效地共享队列.然后每个流程实例可以是单线程的; 它会在接受新连接时阻止.当客户端连接时,其中一个空闲流程实例将接受该客户端.
这将允许每个进程具有非常简单的单线程实现,除非通过显式共享内存,否则不会共享任何内容,并且用户将能够通过启动更多实例来调整处理带宽.
这样的功能是否存在?
编辑:对于那些问"为什么不使用线程?"的人 显然线程是一种选择.但是在单个进程中有多个线程,所有对象都是可共享的,并且必须非常小心以确保对象不是共享的,或者一次只对一个线程可见,或者是绝对不可变的,以及最流行的语言和运行时缺乏对管理这种复杂性的内置支持.
通过启动一些相同的工作进程,您将获得一个默认不共享的并发系统,从而使构建正确且可伸缩的实现变得更加容易.
我可以编写自己的算法来做到这一点,但我觉得在C#中应该有相当于ruby的人性化.
我用Google搜索,但只找到了将日期人性化的方法.
例子:
似乎大多数与JNI(Java Native Interface)相关的文档或帮助程序库都涉及从Java调用本机代码.这似乎是它的主要用途,即使它能够更多.
我想主要在相反的方向上工作:通过向其添加一些Java库来修改现有的(相当大的)可移植C++程序.例如,我想让它通过JDBC调用数据库,或者通过JMS调用消息队列系统,或发送电子邮件,或调用我自己的Java类等.但是使用原始JNI这是非常不愉快和容易出错的.
所以我理想地想编写可以像C++/CLI一样调用CLR类的C++代码来调用Java类.就像是:
using namespace java::util::regex; // namespaces mapped
Pattern p = Pattern.compile("[,\\s]+");
array<java::lang::String> result =
p.split("one,two, three four , five");
for (int i=0; i < result.length(); i++)
std::cout << result[i] << std::endl;
Run Code Online (Sandbox Code Playgroud)
这样,我就不必通过传递名称和奇怪的签名字符串来手动完成获取方法ID的工作,并且可以防止由未经检查的API调用方法引起的编程错误.实际上它看起来很像等效的Java.
NB.我还在谈论使用JNI!作为一项基础技术,它非常适合我的需求.它"在进行中"并且高效.我不想在一个单独的进程中运行Java并对它进行RPC调用.JNI本身很好.我只想要一个愉快的界面.
必须有一个代码生成工具来创建等效的C++类,命名空间,方法等,以完全匹配我指定的一组Java类所公开的内容.生成的C++类将:
这样一个免费的,开源的,可移植的库/工具是存在还是我在做梦?
注意:我发现了这个现有的问题,但在那种情况下,OP并不像我一样对完美的要求......
更新:关于SWIG的评论引发了我之前的问题,这似乎表明它主要是相反的方向,所以不会做我想要的.
重要
更新:我已经开始研究自己的解决方案了:
https://github.com/danielearwicker/cppjvm
如果这已经存在,请告诉我!
NB.如果您正在考虑在自己的项目中使用它,请自由,但请记住,现在代码已经有几个小时了,到目前为止我只编写了三个非常不费力的测试.
注意:这不是Jeff的问题的重复.
那个问题问"是等同的吗?" 我知道没有,我想知道为什么!
我问的原因是我只是清楚它有多重要,结论对我来说似乎很奇怪.
Microsoft企业库的异常处理块建议我们使用此模式:
catch (Exception x)
{
if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
throw;
// recover from x somehow
}
Run Code Online (Sandbox Code Playgroud)
该策略是在XML文件中定义的,这意味着如果客户遇到问题,我们可以修改策略以帮助跟踪(或者可能还有问题)以便快速解决问题,直到我们正确处理它为止. - 这可能涉及与第三方争论,关于谁的错.
这基本上是对一个简单事实的承认,即在实际应用中,如果没有这样的设施,实际上就无法管理异常类型的数量及其"可恢复性"状态.
与此同时,MS的CLR团队表示这不是一个选择,事实证明这些人知道他们在谈论什么!问题是在catch
块运行之前,finally
嵌套在块内的任何块try
都将被执行.所以这些finally
块可能会执行以下任何操作:
请注意,using
语句和C++/CLI析构函数构建在try
/上finally
,因此它们也会受到影响.
很明显,过滤异常的catch
/ throw
模式并不好.实际需要的是一种通过策略过滤异常而不实际捕获它们从而触发finally
块执行的方法,除非我们找到一个告诉我们异常可以安全恢复的策略.
CLR团队最近在博客上写了这篇文章:
结果是我们必须在VB.NET中编写一个辅助函数,以允许我们从C#访问这个重要的功能.存在问题的一个重要线索就是BCL中有代码可以做到这一点.很多人都写过关于这样做的博客,但他们很少提及关于try
/ finally
blocks 的事情,这是杀手.
我想知道的是:
更新:如上所述,我已经搜索过Microsoft Connect而没有找到任何内容.我也(不出所料)谷歌搜索.我只找到人们解释为什么他们需要这个功能,或者指出它在VB.NET中的优势,或者毫无结果地希望它将 …
在调查这个问题时,我很好奇C#4.0中新的协方差/逆变特性将如何影响它.
在Beta 1中,C#似乎不同意CLR.回到C#3.0,如果你有:
public event EventHandler<ClickEventArgs> Click;
Run Code Online (Sandbox Code Playgroud)
......然后你在其他地方:
button.Click += new EventHandler<EventArgs>(button_Click);
Run Code Online (Sandbox Code Playgroud)
...编译器会barf,因为它们是不兼容的委托类型.但是在C#4.0中,它编译得很好,因为在CLR 4.0中,类型参数现在被标记为in
,因此它是逆变的,因此编译器假定多播委托+=
将起作用.
这是我的测试:
public class ClickEventArgs : EventArgs { }
public class Button
{
public event EventHandler<ClickEventArgs> Click;
public void MouseDown()
{
Click(this, new ClickEventArgs());
}
}
class Program
{
static void Main(string[] args)
{
Button button = new Button();
button.Click += new EventHandler<ClickEventArgs>(button_Click);
button.Click += new EventHandler<EventArgs>(button_Click);
button.MouseDown();
}
static void button_Click(object s, EventArgs e)
{
Console.WriteLine("Button was clicked");
}
} …
Run Code Online (Sandbox Code Playgroud) 我现在正在开发一个项目,其中一部分使用托管C++.在托管C++代码中,我正在创建一个DataTable.在为数据表定义列时,我需要指定列的类型.在C#中,那会:
typeof运算(INT)
但是我如何在托管C++中做到这一点?
谢谢!
来自对公告博客帖子的评论:
关于JSON:JSON的结构类似于协议缓冲区,但协议缓冲区二进制格式仍然更小,编码速度更快.尽管如此,JSON为协议缓冲区提供了一个很好的文本编码 - 编写一个编码器/解码器,使用protobuf反射将任意协议消息转换为JSON和从JSON转换,这是微不足道的.这是与AJAX应用程序通信的好方法,因为用户在访问您的页面时下载完整的protobuf解码器可能太多了.
制作一个映射可能是微不足道的,但两者之间是否有一个"明显"的映射,任何两个独立的开发团队自然会解决这个问题?如果两个产品支持PB数据并且可以互操作,因为它们共享相同的.proto规范,我想知道如果他们独立引入相同规范的JSON反射,他们是否仍然能够互操作.可能会有一些任意的决定,例如,枚举值是由字符串表示的(人类可读的典型JSON)还是整数值?
那么是否存在已建立的映射,以及用于从.proto规范生成JSON编码器/解码器的任何开源实现?