[问题记录.dotnet]取网卡信息报错"找不到"-WMI - Not found

本文介绍了解决因WMI存储库损坏导致的System.Management.ManagementException异常的方法。提供了详细的步骤来重建WMI存储库,并附带了一个批处理脚本来帮助完成整个过程。

异常:

System.Management.ManagementException: 找不到 
   在 System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
   在 System.Management.ManagementObject.Initialize(Boolean getObject)
   在 System.Management.ManagementBaseObject.get_wbemObject()
   在 System.Management.ManagementBaseObject.get_ClassName()
   在 System.Management.ManagementClass.GetInstances(EnumerationOptions options)


现象:

某台机器之前使用正常,突然报这个错。
其他机器均正常。


解决:

1. 确保服务“Windows Management Instrumentation”开启。
2. 如果已经开启还是有问题,那么可能是WMI存储库损坏,需要重建WMI存储库。

要重建WMI存储库,(Win7等系统)步骤操作:
(如果是XP系统,参考 http://windowsxp.mvps.org/repairwmi.htm
————————————–

1.开始->所有程序->附件,以管理员身份打开命令提示符command
2.停止WMI服务:net stop winmgmt
3.Repository目录改名备份:ren %windir%\System32\Wbem\Repository Repository_backup
4.重启WMI服务:net start winmgmt
5.运行 winmgmt /salvagerepository 尝试重建Repository
6.注册WMI组件:
cd /d %windir%\system32\wbem
for /f %%s in (‘dir /b *.dll’) do regsvr32 /s %%s
for /f %%s in (‘dir /b *.mof *.mfl’) do mofcomp %%s
wmiprvse /regserver
winmgmt /regserver

7.重新启动系统

8.重新安装自动更新成功
—————————————–
如果仍不成功,运行 %SystemRoot%\System32\Wbem\WbemTest.exe 测试WMI连接,点击连接,再次点击连接。如果仍然有连接错误,那么需要尝试全面的重建,运行下面的命令:

rundll32.exe setupapi,InstallHinfSection WBEM 132 %windir%\inf\wbemoc.inf

执行上面的命令后,可能会需要读取 Windodws 7/Windows 2008 R2 安装盘。


补充:重建WMI的批处理脚本

@echo on 
cd /d c:\temp 
if not exist %windir%\system32\wbem goto TryInstall 
cd /d %windir%\system32\wbem 
net stop winmgmt 
winmgmt /kill 
if exist Rep_bak rd Rep_bak /s /q 
rename Repository Rep_bak 
for %%i in (*.dll) do RegSvr32 -s %%i 
for %%i in (*.exe) do call :FixSrv %%i 
for %%i in (*.mof,*.mfl) do Mofcomp %%i 
net start winmgmt 
goto End 


:FixSrv 
if /I (%1) == (wbemcntl.exe) goto SkipSrv 
if /I (%1) == (wbemtest.exe) goto SkipSrv 
if /I (%1) == (mofcomp.exe) goto SkipSrv 
%1 /RegServer 


:SkipSrv 
goto End 


:TryInstall 
if not exist wmicore.exe goto End 
wmicore /s 
net start winmgmt 
:End 


将这段代码保存成  BAT格式的后  在服务器上运行 即可




分析:

导致错误的代码段
public static string GetNetworkCardInfo()
{ 
    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moc2 = mc.GetInstances();  <span style="color:#ff0000;">//这一句抛出的异常</span>
    string netcard = string.Empty;
    foreach (ManagementObject mo in moc2)
    {
        if ((bool)mo["IPEnabled"] == true)
        {
            netcard = mo["MacAddress"].ToString();
            mo.Dispose();
            break;
        }
        mo.Dispose();
    }
    return netcard;
}
原因:
System.Management 命名空间下的方式基本都是依赖WMI (Windows Management Instrumentation) 服务的,所以自然就联想到WMI的问题。然后去用工具或vbs脚本检验一下,基本就能确认了。
 

<think>好的,用户遇到了在使用dotnet运行DLL时出现System.MissingMethodException,提示不到程序集的入口点的问题。我需要先理解这个错误的原因,然后给出解决方案。 首先,System.MissingMethodException通常表示尝试调用的方法不存在。可能的原因包括:DLL文件损坏、引用的版本不匹配、目标框架不兼容,或者DLL本身不是可执行程序集。用户用dotnet run运行DLL可能有问题,因为run命令通常用于项目或可执行文件,而不是直接运行DLL。 接下来,根据引用[1]中的信息,P/Invoke可能涉及本地DLL的调用,如果入口点声明不正确,会导致不到方法。比如,使用DllImport时方法名或字符集错误。另外,检查DLL是否包含所需的入口点,比如使用dumpbin.exe工具查看导出函数是否正确,这来自引用[1]中提到的使用dumpbin.exe帮助描述P/Invokes的方法。 用户可能需要确认DLL是否是有效的.NET程序集。如果不是,可能需要通过P/Invoke调用,并确保入口点正确。此外,检查项目文件是否引用了正确的依赖项,以及目标框架是否匹配。如果DLL是控制台应用程序,可能需要使用dotnet exec或直接运行生成的exe文件,而不是用dotnet run。 还要考虑是否是入口点名称的大小写或字符集问题,比如指定CharSet为Unicode或Ansi。另外,确保DLL的位数(x86/x64)与当前运行环境一致。如果DLL需要特定运行时环境,如.NET Core而不是.NET Framework,也可能导致问题。 总结可能的解决步骤:检查DLL是否为可执行程序集、使用正确命令运行、验证入口点、检查依赖项和目标框架、使用dumpbin工具分析DLL。根据这些思路,分步骤给出解决方案,并建议用户参考相关引用中的资源,如如何调用本地DLL和dumpbin的使用。</think>在使用.NET运行DLL时遇到$System.MissingMethodException$错误(提示“不到程序集入口点”),可能由以下原因及解决方案引起: --- ### **1. 确认DLL类型与运行方式** - **问题本质**:`.dll`文件通常为类库而非独立可执行文件。若直接通过`dotnet run`运行,可能因缺少入口点(Main方法)报错[^1]。 - **解决方案**: - **方法1**:若DLL是控制台应用程序,应通过`dotnet exec`命令运行: ```bash dotnet exec YourAssembly.dll ``` - **方法2**:直接调用生成的`.exe`文件(需确认项目输出类型为`Exe`): ```bash ./bin/Debug/netX.X/YourProject.exe ``` --- ### **2. 检查入口点声明(P/Invoke场景)** - **问题场景**:调用非托管DLL时,若入口点名称或字符集不匹配会导致异常[^1]。 - **验证步骤**: 1. 使用`dumpbin.exe`查看DLL导出函数(需安装Visual Studio): ```bash dumpbin /exports YourNativeDll.dll ``` 2. 在C#代码中严格匹配入口点名称和调用约定: ```csharp [DllImport("YourNativeDll.dll", EntryPoint = "ExactFunctionName", CharSet = CharSet.Auto)] public static extern void NativeMethod(); ``` --- ### **3. 依赖项与目标框架兼容性** - **常见问题**: - 引用的NuGet包版本与目标框架(如`.NET Core` vs `.NET Framework`)不兼容 - 项目文件`.csproj`中未正确定义输出类型 - **解决方案**: 1. 检查`.csproj`文件配置: ```xml <PropertyGroup> <OutputType>Exe</OutputType> <!-- 或 Library --> <TargetFramework>net6.0</TargetFramework> </PropertyGroup> ``` 2. 清理并重新生成解决方案: ```bash dotnet clean dotnet build ``` --- ### **4. 程序集加载上下文问题** - **特殊场景**:动态加载DLL时(如`Assembly.LoadFrom`),若依赖项未正确加载会引发异常- **改进方案**: ```csharp // 使用AssemblyLoadContext显式管理依赖项 var context = new AssemblyLoadContext("MyContext", true); var assembly = context.LoadFromAssemblyPath("YourAssembly.dll"); var type = assembly.GetType("YourNamespace.YourClass"); var method = type.GetMethod("YourMethod"); method.Invoke(null, null); context.Unload(); ``` --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俊哥V

这是个嘛?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值