0

我希望使用 LogParser.DLL 程序集,所以我在普通控制台应用程序上对其进行了测试,它可以工作,然后我将它放入服务器,发送到 win 2003 进行测试(我没有更多可用空间来安装数据库等服务),。 .. 它总是在 eventViewer 日志中返回 FileNotFoundException 错误...

我尝试使用堆栈跟踪来查看实际发生的情况,我发现 DLL 根本没有导入,在谷歌搜索后,我在这个网站上找到了答案,告诉使用 .Net 命令提示符,然后使用导入汇编命令,如果我写它是 tblimp "file name" /out "new file"

我制作了我的程序集,它是 .net 4,所以我去了我的旧 VS,并做了同样的事情来提供一个 .net 2.0.x 兼容的 DLL,我使用它并且它有效,但是......

出现新错误:

错误消息:检索具有 CLSID {8CFEBA94-3FC2-45CA-B9A5-9EDACF704F66} 的组件的 COM 类工厂失败,原因是以下错误:80040154。StackTrace:在 FileEventReaderService.EventReader.ReadEventsAndStoreInDatabase(字符串 startDate,字符串 endDate)

            ILogRecordset rs = null;
            try
            {
                ((DebugLogger) _logProviderDebugMode).Log("T1-2", "Debug-EventReaderClass",
                                                          EventLogEntryType.Information);
                LogQueryClass qry = new LogQueryClass();
                COMEventLogInputContextClass eventLogFormat = new COMEventLogInputContextClassClass();
                ((DebugLogger) _logProviderDebugMode).Log("T1-3", "Debug-EventReaderClass",
                                                          EventLogEntryType.Information);
                string query = "select * from security WHERE TimeGenerated >= '" + startDate +
                               "' and TimeGenerated <'" + endDate +
                               "' and (eventid=560 or eventid=540)";
                rs = qry.Execute(query, eventLogFormat);
                ((DebugLogger) _logProviderDebugMode).Log("T1-4", "Debug-EventReaderClass",
                                                          EventLogEntryType.Information);
                for (; !rs.atEnd(); rs.moveNext())
                {
                        //Processes
                }

            }
            catch(Exception ex)
            {
                ((DebugLogger)_logProviderDebugMode).Log(
                        "T1-5\nError Msg: " + ex.Message + "\nStackTrace: " + ex.StackTrace
                        , "Debug-EventReaderClass",
                        EventLogEntryType.Error);
            }
            finally
            {
                ((DebugLogger)_logProviderDebugMode).Log("T1-6", "Debug-EventReaderClass",
                                                          EventLogEntryType.Information);
                if (rs != null)
                    rs.close();
            }

我试图捕捉异常并查看是否导入了任何数据,但似乎 rs 什么也不返回,也没有“finally”块中的 if(rs!=null) 再次它本身就是一个错误,这意味着 rs 为空

事件类型:信息事件源:EventLoggerService 事件类别:无事件 ID:0 日期:2012 年 8 月 5 日时间:上午 2:47:20 用户:不适用计算机:HF-SERVER-PC 描述:Debug-EventReaderClass:T1 -2

类变量信息:

_logProvider:FileEventReaderService.Services.Logger.EventLogger _logProviderDebugMode:FileEventReaderService.Services.Logger.DebugLogger _licenceState:好的 _dataBase:deadManN _interval:5 _timeGap:1 _previousReadTime:8/5/2012 2:40:19 AM _lastReadTime:8/5/2012 2:46:20 AM _parserLock:System.Object _subtleTime:TimerLib.SubtleTime _parserService:FileEventReaderService.Services.Util.ParserService5 _connectionStringBuilder:FileEventReaderService.Services.Util.ConnectionStringBuilder _lastTime:18 _minutes:18

有关详细信息,请参阅http://go.microsoft.com/fwlink/events.asp上的帮助和支持中心 。

上面的日志,是我在错误之前做的最后一个日志,然后它显示了记录在“catch”块中的日志,所以错误可能在这里:

        LogQueryClass qry = new LogQueryClass();
        COMEventLogInputContextClass eventLogFormat = new COMEventLogInputContextClassClass();

所以我再次开始搜索我的错误消息,并发现了一些我无法单独处理的事情,

例如,我看到有人对您说需要注册 DLL manulay 或使用 dllregisterservice 或有关将应用程序仅编译为 86X cpu 类型的事情,但我不想这样做......因为我不为单个用户编写这个使用已知的硬件和软件...

现在有人可以帮忙吗?在设置应用程序时注册 dll 或任何其他可能对此事有帮助的事情?“Interop.MSUtil.dll”库?

并且请帮助,这对我来说非常重要,但我仍然需要太多时间,大约几个月后,我只检查逻辑错误,而不是编译错误:|

4

2 回答 2

1

我正要写一个服务,应用程序,我做了一些,我爱上了我们讨论过的错误和评论......

时间过去了,所以我不能告诉你发生的每一件事,但我会给你答案,让我摆脱这个......


首先,我需要处理 dll 和我自己的应用程序而不是其他应用程序,并且不运行例如带有隐藏命令的日志解析器和通过 Diagnostig.Process 将查询作为参数...

所以我拿了dll,

单独的 dll 在我提供用于测试的 win 应用程序中工作,在 O/S 中与在其中,可能是出于证书原因..但它在我的其他服务器操作系统中没有工作,......也在服务应用程序中拿出一个日志告诉我我有一个 IO:FileNotFoundException所以我放了 try catch 块然后打印堆栈跟踪,异常告诉我一旦缺少程序集......所以我开始搜索并发现我应该导入dll以某种方式,所以第1步

  • 看看你需要什么样的 dll,我的意思是 .net 版本,例如,我需要基于 .net 2.x 以获得更多旧操作系统的支持,但 VS 2010 给了我一个基于 .net 4.x 的 DLL,所以我指的是 Visual Studio 2005在程序文件中
  • 从“开始”菜单的所有程序菜单中打开 Visual Studio 文件夹,转到“Visual Studio 工具”文件夹,最后运行“Visual Studio 命令提示符”
  • 接下来将您的 logparser.dll 文件放在可访问的位置,例如 c:\temp\
  • 运行这个命令: tlbimp "c:\temp\logparser.dll" /out:"c:\temp\Interop.MSUtil.dll"
  • 请注意“Interop.MSUtil.dll”是应用程序寻找的程序集名称,但您不能直接logparser.dll 重命名为它
  • 将其放入您的项目中,并将所有引用从 logparser.dll 切换到 Interop.MSUtil.dll (这是因为名称空间不同)

直到这里我修复了一些错误,但这并不像服务工作成功,运行日志解析器时出现新错误,并导致类实例返回 Nulls,.. 错误在这里:

错误消息:检索具有 CLSID {8CFEBA94-3FC2-45CA-B9A5-9EDACF704F66} 的组件的 COM 类工厂失败,原因是以下错误:80040154。StackTrace:在 FileEventReaderService.EventReader.ReadEventsAndStoreInDatabase(字符串 startDate,字符串 endDate)

此步骤可能没有任何原因,但由于我遇到错误消息的变化,我把它放在这里

因为我想为很多用户打包我的应用程序,并不是我告诉他们所有人都运行命令,所以我搜索了更多,有人说注册dll,但你不能将logparser.dll放在全局程序集catch文件夹中设置的,后来我发现我们做的注册与将程序集放入 GAC 不同......

我还发现我们是否要先将 dll 放入 GAC,我们不能放入 logparser 导致它导出,但 Introp.MSUtil.dll 也设置返回错误,将 Interop.MSUtil.dll 放入 GAC 文件夹该错误与程序集命名有关,经过一番搜索,我发现该错误是针对不同的东西,并且发生在程序集未使用对密钥签名的情况下...

您可以通过cmd创建配对密钥,您安装的每个操作系统都有一个它生成的随机密钥,您也可以导出和导入这些密钥以用于特殊证书问题,这些命令自然有他们的网络工程用户,但我们软件在这里也使用它... 所以第 2 步

如果您遇到 8007007E / 8007007F 错误,请阅读本节...它们自然是因为程序集注册的原因,我不知道,但也许还有一个 dll 签名的共享密钥,您在执行这些操作之前还可以执行另一件事是测试regsvr32 "[dll file address]" 注册一个 dll,如果应用程序不直接使用和搜索 dll,您可以在注册之前将其放在任何文件夹中,例如在我们的项目中,我们指向 Introp.MSUtil.dll 而不是 logparser.dll我们还需要它来注册,然后我们在 logparser.dll 上运行 regsvr32 命令(此命令仅用于测试,在设置和部署应用程序时没有用,您也可以使用 /u 开关取消注册 dll进一步测试)

  • 使用 CMD 使用以下命令创建一对密钥文件: sn -k [file name]它在您所在的地址中创建文件
  • 接下来再次转到第一步,但不要使用旧命令,而是使用这个新命令,它也混合密钥对来生成 dlltlbimp "[logparser.dll address]" /out:"[address]\Interop.MSUtil.dll" /pr imary /keyfile:"[pair key file address]"
  • 现在使用新签名的 dll,而不是我们之前创建的那个……(Interop.MSUtil.dll)

也存在错误......所以我发现GAC(Global Assembly Catch)不会单独工作,在修复所有错误后,我注意到我可以,但我不需要将Interop.MSUtil.dll放入GAC我的设置文件夹...但是这个注册问题regsvr32是问题吗?啊,是的,虽然我听说这与将程序集放入 GAC 相同,但这是不对的,将 dll 注册为全局程序集与使用 regsvr32 注册它不同......如果你想知道你的 dll 是已经注册了,我想你现在需要命名空间或里面的主程序集,所以你可以通过以下步骤查看它是否已注册:

  • 转到开始菜单并打开“运行”工具
  • 输入dcomcnfg并按“enter”打开组件服务工具
  • 进入这个目录:Console Root->Component Services->Computers->My Computer->DCOM Config
  • 现在例如查看 log parser.dll 是否已注册,查找“Interop.Msutil”或“MSUtil”之类的名称
  • 如果存在,则 dll 已注册,否则不存在

好的,让我们回到主题,我们需要注册 dll,它会导致一些我不记得的错误...如果您使用命令注册 logparser.dll 并且它有效,则导致类无法正常工作并返回空值,用于打包你的设置你需要做以下事情所以第3步

  • 将 logparser.dll 程序集(安装程序知道它是文件而不是程序集)放在可访问的文件夹中,例如安装项目的应用程序文件夹...
  • 右键单击解决方案资源管理器中的文件并选择属性
  • 单击注册部分,然后单击下拉按钮以查看所有可用选项...
  • 从列表中选择vsdrfCOMSelfReg,注意像我们创建的(Introp.MSUtil.dll)这样的程序集没有提供像这个选项这样的选项,所以我们不能注册它,你也不能用regsvr32 注册那个 dll ......其他选项在我测试时不会注册 dll

我希望这对你有帮助:)

PS:请注意 logparser.dll 和 Interop.MSUtil.dll 不会被项目自动检测到,您必须手动将它们添加到您的安装程序和 MSI 项目中......正如我解释的那样,您还需要两个 dll

我希望这对你有用...

非常感谢@Andrii Kalytiiuk
由 Hassan Faghihi 评价

于 2012-08-12T04:52:12.023 回答
1

这是一个老问题,但我遇到了这个错误,发现接受的答案有点难以解析。

最终,我必须确保在运行代码的机器上安装 LogParser.dll注册了 LogParser。否则我会收到原始问题中显示的错误。

根据我的经验,Interop.MSUtil它不是替代者,LogParser.dll而是促进者。

还值得一提的Interop.MSUtil是,现在可以通过nuget 获得,但安装后,您必须在解决方案的packages文件夹中手动添加对 DLL 的引用,然后右键单击该引用并设置Embed Interop Typesfalse.

于 2018-04-06T15:38:20.093 回答