我想定期在Windows服务的指定用户帐户下运行任意.NET exe.
到目前为止,我已经让我的Windows服务运行逻辑来决定目标进程是什么,以及何时运行它.目标进程以下列方式启动:
在第一次出现这种情况,目标进程执行罚款,然后正常关闭.然而,每次后续时间,一旦目标进程启动,它就会抛出错误"应用程序无法正常运行(0xc0000142)".重新启动Windows服务将允许进程再次成功运行(第一次执行).
当然,目标是每次都成功执行目标进程.
关于上面的步骤2:要以不同的用户身份运行进程.NET调用win32函数CreateProcessWithLogonW.此函数需要一个窗口句柄来记录指定的用户.由于Windows服务未在交互模式下运行,因此它没有窗口句柄.这个中间过程解决了这个问题,因为它有一个可以传递给目标进程的窗口句柄.
请不要使用psexec或windows任务规划器的建议.我已经接受了我的生活,包括以上述方式解决问题.
这个简单的程序从15个线程开始 - 根据计数.有时在它的一生中它会掉落一些,但它们会回来.
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine(Process.GetCurrentProcess().Threads.Count);
Thread.Sleep(500);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我期待的过程,只是有一个线程(和我的直觉是由备份这个)
没有调试器,该进程只有(!)4个线程.当然任何CLR的东西都会隐藏在我的进程中?
这有多重要?这个过程真的有那么多线程吗?为什么?
我有1位byte(总是在最低位置),我想要反转.即给定00000001我想获得00000000和00000000我想要00000001.
我这样解决了:
bit > 0 ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)
我很想知道如何做到这一点.
在Chrome版本45.0.2454.85中,每当我连接到手机上的Cordova/Crosswalk应用程序时,开发人员工具会在窗口顶部显示黄色警告,并显示文本:" 在调试时考虑禁用Chrome数据保护程序 ".
是否在Crosswalk插件(版本1.2,WebView版本44.0.2403.117)中启用了数据保护程序?如果是这样,我可以将其关闭吗?
我在我的代码中有一堆Console.WriteLines,我可以在运行时观察到.我与我也写过的本地库进行通信.
我想在本地库中粘贴一些printf并观察它们.但是我没有在运行时看到它们.
我创建了一个令人费解的hello world应用程序来演示我的问题.当应用程序运行时,我可以调试到本机库并看到调用hello world.输出永远不会落在文本作者身上.请注意,如果相同的代码作为控制台应用程序运行,那么一切正常.
C#:
[DllImport("native.dll")]
static extern void Test();
StreamWriter writer;
public Form1()
{
InitializeComponent();
writer = new StreamWriter(@"c:\output.txt");
writer.AutoFlush = true;
System.Console.SetOut(writer);
}
private void button1_Click(object sender, EventArgs e)
{
Test();
}
Run Code Online (Sandbox Code Playgroud)
和原生部分:
__declspec(dllexport) void Test()
{
printf("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
更新:下面的hamishmcn开始讨论调试/发布版本.我在上面的button1_click方法中删除了本机调用,只是用标准的Console.WriteLine.net调用替换它.当我在调试模式下编译并运行它时,消息被重定向到输出文件.当我切换到释放模式时,呼叫没有被重定向.控制台重定向似乎只在调试模式下工作.我该如何解决这个问题?
当重写自定义控件的OnPaint方法时,我提供了一个PaintEventArgs,它包含一个Graphics对象和一个ClipRectangle.ClipRectangle对我的口味来说太小了,所以我想要将它扩展为100像素,或者完全忽略它.
无论我做什么,我似乎都无法突破ClipRectangle.到目前为止,我已经尝试过:
e.ClipRectangle.Inflate(100, 0);
e.Graphics.ResetClip();
e.Graphics.SetClip(new Rectangle(x, y, w, h));
Run Code Online (Sandbox Code Playgroud)
父控件调用Invalidate(true)(强制所有子控件的子控件失效).
我也做了一些谷歌搜索,看着鲍勃鲍威尔的网站,但找不到核武器.
ResetClip将Graphics对象的剪切区域重置为无限大的Rectangle,但Graphics对象高兴地继续使用提供的ClipRectangle.
救命.
考虑:
var d = new Date();
var j = d.toJSON();
var s = JSON.stringify(d);
Run Code Online (Sandbox Code Playgroud)
每个变量的console.log返回:
Tue Jul 29 2014 13:27:19 GMT+0200 (W. Europe Summer Time)
2014-07-29T11:27:19.253Z // a string
"2014-07-29T11:27:19.253Z" // same string as above but packed in ""
Run Code Online (Sandbox Code Playgroud)
我希望他们回归同样的事情,但后来我读了
如果stringify方法看到包含toJSON方法的对象,则它会调用该方法,并将返回的值字符串化.这允许对象确定自己的JSON表示.
和https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify:
如果要进行字符串化的对象具有名为toJSON的属性,其值为函数,则toJSON方法会自定义JSON字符串化行为:而不是被序列化的对象,调用时toJSON方法返回的值将被序列化.例如:
这是否意味着我总是要做以下事情:
var d = new Date();
var j = d.toJSON();
var s;
if (d.toJSON) {
s = d.toJSON();
} else {
s = JSON.stringify(d);
}
Run Code Online (Sandbox Code Playgroud)
确保s == j,因为我不能依赖JSON.stringify不执行两个序列化?
编辑
根据jgillich的回答,以下代码有助于澄清事情(至少对我而言):
var s = …Run Code Online (Sandbox Code Playgroud) 我决定第一次试用LINQ尝试解决这个问题.
我第一次涉足LINQ精彩世界的结果如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>()
{
"fred-064528-NEEDED1",
"xxxx",
"frederic-84728957-NEEDED2",
"sam-028-NEEDED3",
"-----",
"another-test"
};
var result =
from s in list
where (from c in s where c == '-' select c).Count() == 2
select s.Substring(s.LastIndexOf("-") + 1);
foreach (string s in result)
Console.WriteLine(s);
Console.WriteLine("Press Enter");
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何改进上述解决这个人为设计的小例子的方法.我对是否使用了最好的验证方法,或者我如何本地化"按Enter"或类似的东西不太感兴趣; 我只是想使用这个例子来学习更多关于LINQ的知识.
我正在尝试将Type.InvokeMember(String,BindingFlags,Binder,Object,array [])与默认绑定器一起使用.
对象数组中目标方法的一个参数是设置为null的引用类型.我想要我正在调用的方法来实例化引用类型,以便我可以继续使用它.例如:
using System;
namespace ConsoleApplication6
{
class A
{
public void GetReferenceType(object o)
{
o = new object();
}
}
class Program
{
static void Main(string[] args)
{
object o = null;
A a = new A();
Type t = typeof(A);
t.InvokeMember("GetReferenceType", System.Reflection.BindingFlags.InvokeMethod, null, a, new object[] { o });
if (o == null)
{
throw new NullReferenceException();
}
else
{
//do something with o;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
解决方法是提供A一个属性并通过它访问o.
还有其他方法可以不改变A吗?
c# ×7
.net ×5
android ×1
c ×1
coding-style ×1
cordova ×1
javascript ×1
json ×1
lambda ×1
linq ×1
process ×1
reflection ×1
service ×1
winforms ×1