C#中System.Diagnostics.Process.GetProcessesByName(String processName)时报错的处理方法

有时候我们在用EXCEL处理数据时,在最后杀EXCEL进程时,使用System.Diagnostics.Process.GetProcessesByName(String processName)方法会报错,

存取被拒。

描述: 在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。

例外詳細資訊: System.ComponentModel.Win32Exception: 存取被拒。

原始程式錯誤:

在執行目前 Web 要求期間,產生無法處理的例外狀況。如需有關例外狀況來源與位置的資訊,可以使用下列的例外狀況堆疊追蹤取得。

堆疊追蹤:

[Win32Exception (0x80004005): 存取被拒。]
            System.Diagnostics.PerformanceMonitor.GetData(String item) +485
            System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item) +158
            System.Diagnostics.PerformanceCounterLib.get_CategoryTable() +80
            System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String[] categories, Int32[] categoryIndexes) +56
            System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library) +157
            [InvalidOperationException: 無法從遠端電腦取得處理序資訊。]
            System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library) +258
            System.Diagnostics.NtProcessManager.GetProcessInfos(String machineName, Boolean isRemoteMachine) +153
            System.Diagnostics.ProcessManager.GetProcessInfos(String machineName) +37
            System.Diagnostics.Process.GetProcessesByName(String processName, String machineName) +69
            System.Diagnostics.Process.GetProcessesByName(String processName) +11
            SchedulingWL.DPS.DataMaintainAV.showExcel1() in d:\web\wl_scheduling\dps\datamaintainav.aspx.cs:676
            SchedulingWL.DPS.DataMaintainAV.btnExcel_Click(Object sender, ImageClickEventArgs e) in d:\web\wl_scheduling\dps\datamaintainav.aspx.cs:535
            System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) +109
            System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +69
            System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
            System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
            System.Web.UI.Page.ProcessRequestMain() +1292
            

处理方法:
1.在WEBCONFIG中使用
<identity impersonate="true" userName="User" password="ABCDE"/>
放在<system.web>标签中
2.或者将ASP.NET设为管理员权限(IIS5及以下),或者NETWORKSERVICE(IIS6)

版本資訊: Microsoft .NET Framework 版本:1.1.4322.2300; ASP.NET 版本:1.1.4322.2300

转载于:https://www.cnblogs.com/zzyyll2/archive/2007/08/29/874822.html

<think>我们正在处理一个与C#项目相关的问题。根据引用内容,用户似乎对C#调用外部DLL(特别是C++DLL)以及C#中使用DLL和获取进程信息感兴趣。我们将围绕这些主题构建回答。主题1:C#调用C++DLL根据引用[1],当C#调用C++的DLL,参数传递需要注意。例如,C++中如果使用string类型作为参数,在C#中调用可能会引发内存损坏异常。解决方案是将C++中的参数类型改为LPTSTR(即char*),在C#中使用StringBuilder作为对应参数类型。主题2:C#中使用DLL(包括C#自己的DLL)引用[2]展示了如何在C#项目中引用和使用另一个C#项目生成的DLL。步骤包括:1.创建库工程并生成DLL。2.在目标工程中添加对该DLL的引用。3.在代码中使用using语句引入命名空间,然后像使用本地类一样使用DLL中的类。主题3:获取客户端进程信息引用[3]提到可以使用System.Diagnostics.Process.GetProcesses()来获取客户端进程信息,以及如何关闭进程。由于用户没有提出具体问题,我们将根据这些主题生成一个综合性的回答,并生成相关问题。回答结构:1.C#调用C++DLL的注意事项和示例2.C#中使用C#编写的DLL的步骤3.获取和操作进程信息的示例注意:由于引用内容有限,我们将主要基于引用内容进行回答,并确保代码示例正确。生成相关问题:1.关于C#调用C++DLL的更多细节问题2.关于C#DLL的创建和使用3.关于进程操作的其他问题</think>### C# 项目相关问题解答 #### 1. **C# 调用 C++ DLL 的规范方法** 当 C# 调用 C++ DLL ,参数传递需特别注意数据类型兼容性: - **问题根源**:C++ 的 `std::string` 与 C# 的 `string` 内存结构不兼容,直接传递会导致内存损坏异常[^1]。 - **解决方案**: - C++ 侧:将参数类型改为 `LPTSTR`(`char*`) - C# 侧:使用 `StringBuilder` 作为参数类型 - **代码示例**: ```csharp [DllImport("YourCppDll.dll")] public static extern void ProcessText(StringBuilder text, int bufferSize); // 调用示例 StringBuilder sb = new StringBuilder(256); sb.Append("Hello from C#"); ProcessText(sb, sb.Capacity); ``` 此方法解决了参数传入和结果传出的问题[^1]。 #### 2. **C# 引用托管 DLL 的标准流程** 引用 C# 编写的托管 DLL 无需平台调用(P/Invoke),流程如下: 1. **生成 DLL**:创建类库项目,编译生成 `YourLib.dll` ```csharp namespace YourLib { public class Calculator { public int Add(int a, int b) => a + b; } } ``` 2. **添加引用**:在目标项目中右键引用 → 添加引用 → 浏览选择 DLL 3. **调用代码**: ```csharp using YourLib; var calc = new Calculator(); int result = calc.Add(5, 3); // 返回 8 ``` 托管 DLL 可直接实例化类并调用方法[^2]。 #### 3. **进程操作的实践方法** 通过 `System.Diagnostics.Process` 管理客户端进程: - **获取所有进程**: ```csharp Process[] processes = Process.GetProcesses(); foreach (var p in processes) { Console.WriteLine($"{p.ProcessName} (ID: {p.Id})"); } ``` - **关闭特定进程**: ```csharp Process.GetProcessesByName("notepad") .FirstOrDefault() ?.Kill(); ``` 此方法适用于监控或管理客户端应用程序[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值