Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# logparserdl的程序集问题(我使用';tblimp';命令将其转换为Interop.MSUtil)_C#_.net_Dll_.net Assembly_Logparser - Fatal编程技术网

C# logparserdl的程序集问题(我使用';tblimp';命令将其转换为Interop.MSUtil)

C# logparserdl的程序集问题(我使用';tblimp';命令将其转换为Interop.MSUtil),c#,.net,dll,.net-assembly,logparser,C#,.net,Dll,.net Assembly,Logparser,我希望使用LogParser.DLL程序集,所以我在普通控制台应用程序上测试它,它工作了,然后我把它放到服务器上,发送到Win2003进行测试(我没有更多的空间来安装数据库之类的服务)。。。 它总是在eventViewer日志中返回FileNotFoundException错误 我尝试使用堆栈跟踪来查看实际发生的情况,我发现DLL根本不导入,在谷歌搜索之后,我在这个网站上找到了答案,它告诉我使用.Net命令提示符,然后使用导入汇编命令,如果我写的话,它是tblimp“file name”/out

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

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

我制作了我的程序集,它是.NET4,所以我去了我以前的VS,并做了同样的工作来提供一个.NET2.0.x兼容的DLL,我使用它,它工作了,但是

出现新的错误:

错误消息:检索具有CLSID的组件的COM类工厂 {8CFEBA94-3FC2-45CA-B9A5-9EDACF704F66}由于以下原因失败 错误:80040154。StackTrace:在 FileEventReaderService.EventReader.ReadEventsDatabase(字符串 开始日期,字符串结束日期)

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

例如,我看到有人对你说,你需要注册DLL手册或使用dllregisterservice,或是把应用程序只编译为86X cpu类型,但我不想这样做。。。因为我不是为已知硬件和软件的单个用户写的

现在有人能帮忙吗?在安装应用程序时使用dll注册或任何其他可能有助于解决此问题的方法?“Interop.MSUtil.dll”库的名称


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

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

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


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

所以我拿dll

dll在我为测试提供的win应用程序中单独工作,在O/S vs中,它可能是出于证书原因。。 但它在我的其他服务器操作系统中不起作用。。。 同样在服务应用程序中,它会出现一个日志,告诉我我有一个IO:FileNotFoundException,因此我放入try-catch块,然后打印堆栈跟踪,异常告诉我一旦程序集丢失。。。所以我开始搜索并发现我应该以某种方式导入dll,所以步骤1

  • 看看你需要什么样的dll,我指的是.net版本,例如,我需要基于.net 2.x的dll,以便在较旧的操作系统中获得更多支持,但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(这是因为名称空间不同)
在此之前,我修复了一些错误,但并不像服务工作成功,在运行日志解析器时出现了新的错误,并导致类实例返回null,。。 错误在这里:

错误消息:检索具有CLSID的组件的COM类工厂 {8CFEBA94-3FC2-45CA-B9A5-9EDACF704F66}由于以下原因失败 错误:80040154。StackTrace:在 FileEventReaderService.EventReader.ReadEventsDatabase(字符串 开始日期,字符串结束日期)

此步骤可能不会导致任何问题,但由于我在错误消息中遇到了变化,因此我将其放在此处

因为我想为许多用户打包我的应用程序,不像我告诉所有用户运行命令,所以我搜索了更多,有人说要注册dll,但你不能将logparser.dll放在安装程序的全局程序集捕获文件夹中,后来我发现我们做的注册和在GAC中放置组件是不同的

此外,我还发现,如果我们想先将dll放入GAC中,我们不能放入logparser,因为它已导出,但Introp.MSUtil.dll 安装程序还返回了将Interop.MSUtil.dll放入GAC文件夹的错误 错误是关于程序集命名的,经过一些搜索后,我发现错误是针对不同的内容的,并且它发生在程序集未使用对密钥签名的地方

你可以通过cmd创建pair key,你安装的每个操作系统都有一个随机生成的密钥,你也可以导出和导入这些密钥,用于特殊的证书事务,当然这些命令有它们的网络工程用户,但我们软件也在这里使用它。。。 因此第2步

如果您遇到8007007E/8007007F错误,请阅读本节。。。 它们当然是为了注册程序集,我不知道,但也可能是dll签名的共享密钥 在执行这些操作之前,您还可以执行另一项操作,即测试regsvr32“[dll file address]”,它注册一个dll,如果应用程序不直接使用并搜索dll,则可以在注册之前将其放入任何文件夹中 例如,在我们的项目中,我们指向Introp.MSUtil.dll而不是logparser.dll,尽管我们也需要
            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();
            }
        LogQueryClass qry = new LogQueryClass();
        COMEventLogInputContextClass eventLogFormat = new COMEventLogInputContextClassClass();