gpt4 book ai didi

c# - 运行 Powershell 脚本导致 'Memory corruption' 或 'Cannot Read or Write'

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:50 25 4
gpt4 key购买 nike

我正在制作一个程序,为您创建 Wi-Fi 热点并使用 powershell 脚本自动启用 Internet 连接共享。

该脚本可以完美运行,但我必须等待它完成,这样我才能通知用户它已完成。我正在使用以下有效的代码,但是......

但它在我的家用电脑上崩溃并导致错误,但速度更快。我收到无法读取或写入或内存已损坏的错误,我无法真正解释。

public static void ToggleIcs(string connectionInterface, bool state)
{
string toggle;
string par1;
string par2;
if (state){
toggle = "EnableSharing";
par1 = "0";
par2 = "1";
}else{
toggle = "DisableSharing";
par1 = "";
par2 = "";
}
using (PowerShell powerShellInstance = PowerShell.Create())
{
// this script enables or disables internet sharing with the connectionInterface given.
powerShellInstance.AddScript("" +
"regsvr32 hnetcfg.dll /s;" +
"$m = New-Object -ComObject HNetCfg.HNetShare;" +
"$m.EnumEveryConnection |% { $m.NetConnectionProps.Invoke($_) };" +
"$c = $m.EnumEveryConnection |? { $m.NetConnectionProps.Invoke($_).Name -eq '" + connectionInterface + "' };" +
"$config = $m.INetSharingConfigurationForINetConnection.Invoke($c);" +
"Write-Output $config.SharingEnabled;" +
"Write-Output $config.SharingConnectionType;" +
"$config." + toggle + "(" + par1 + ");" +

"$m2 = New-Object -ComObject HNetCfg.HNetShare;" +
"$m2.EnumEveryConnection |% { $m2.NetConnectionProps.Invoke($_) };" +
"$c2 = $m2.EnumEveryConnection |? { $m2.NetConnectionProps.Invoke($_).DeviceName -Match 'Microsoft Hosted Network Virtual Adapter' };" +
"$config2 = $m2.INetSharingConfigurationForINetConnection.Invoke($c2);" +
"Write-Output $config2.SharingEnabled;" +
"Write-Output $config2.SharingConnectionType;" +
"$config." + toggle + "(" + par2 + ");");


PSDataCollection<PSObject> outputCollection = new PSDataCollection<PSObject>();
IAsyncResult result = powerShellInstance.BeginInvoke<PSObject, PSObject>(null, outputCollection);
Console.WriteLine(DateTime.Now + ">> Started Powershell script");

int i = 0;
while (!result.IsCompleted)
{
if (i < 60)
{
Console.WriteLine(DateTime.Now + ">> Running script");
}
else
{
ScriptFailed();
powerShellInstance.Stop();
break;
}
i++;
Thread.Sleep(1000);
}
Console.WriteLine(DateTime.Now + ">> Executed Internet Sharing script");
}
}

这是我得到的错误:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

我没有得到一行说明崩溃的地方,但它在 Thread.Sleep(1000); 之后崩溃。我发现使用断点

正如我所说,该脚本在我的笔记本电脑上运行良好,它在我的速度更快的计算机上也能正常运行,但它一遇到 Thread.Sleep(1000) 就崩溃了。崩溃后,我检查了网络和共享中心是否启用了 ICS,它确实启用了。

我尝试删除 Thread.Sleep(1000); 但无论如何它在前一行崩溃了。

我可以尝试或做些什么不同的事情?


编辑

我还没有堆栈跟踪,因为我不在我更快的 PC 上,但它崩溃了。但我会尽快发布。


编辑

正如 TheLethalCoder 所提到的,可能是我在更新时尝试访问 IsCompleted。如果这就是它发生的原因,我将如何检查它是否正在被更改或等待它完成。
编辑

因为我真的不知道调用堆栈是做什么用的,或者堆栈跟踪是什么,以及我如何使用它,所以我提供了崩溃前一刻我所看到的图像。 Stack Trace


编辑我四处窥探,发现了一些我尝试过的东西。

首先,在应用程序属性 -> 构建中,我勾选了“首选 32 位” 因为有些人用这个解决了他们的问题。我没有遇到崩溃,但脚本也无法运行并导致我的互联网连接中断。
所以我把它重新打开了。我还尝试了 netsh winsock reset 命令并重新启动了我的电脑,但它仍然崩溃。

我现在完全没有线索,但我为前来寻找答案的人发布了这两件事,也许这会奏效。

最佳答案

MSDN article: Polling for the Status of an Asynchronous Operation声明您轮询结果的方式是正确的。然而,他们的示例不包括 Thread.Sleep:

while (result.IsCompleted != true)
{
UpdateUserInterface();
}

因此,为了消除这种情况,我将使用以下代码片段来跟踪变量而不休眠,请注意,尽管在每个循环中打印到 Console 会很快污染窗口:

Stopwatch sw = new Stopwatch();
sw.Start();
while (!result.IsCompleted)
{
if (sw.EllapsedMilliseconds >= 60000) //60 seconds
{
break;
}

Console.WriteLine(DateTime.Now + ">> Running script");
}

if (!result.IsCompleted)
{
ScriptFailed();
powerShellInstance.Stop();
}

这与其说是一个答案,不如说是一个评论,但是它太长了,不能用作评论。

关于c# - 运行 Powershell 脚本导致 'Memory corruption' 或 'Cannot Read or Write',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41739835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com