无法加载文件或程序集

时间:2010-07-06 14:24:52

标签: .net vb.net dll scheduled-tasks

这是我的错误消息:

  

无法加载文件或程序集'file:/// C:\ Windows \ system32 \ Rule.dll'。   系统找不到指定的文件。

问题是同一个exe在我的开发环境中有效,但在生产服务器上则无效。该程序是一个应该作为Windows Server 2008上的计划任务运行的工具。它由一个exe,一个所谓的Database.dll和Rule.dll组成。 exe应该在代码隐藏中动态加载Rule.dll,但只有从任务计划程序启动时才会出现上述错误。为什么它在System32文件夹中而不是在Application文件夹中?这是UAC问题吗?

'Load the rule engine into memory
Dim asmRule As System.Reflection.Assembly = Nothing
Try
  asmRule = System.Reflection.Assembly.LoadFrom("Rule.dll") 'fails on productive system
Catch ex As System.Exception
  HistoryLog.writeLog("SysLog", ex, "Cannot find Rule.dll in Application Folder")
End Try

4 个答案:

答案 0 :(得分:7)

方法LoadFrom将使用Environment.CurrentDirectory构建将加载的程序集的完整路径。当前目录与应用程序基本路径不同。

您应该提供LoadFrom方法的完整路径,如果文件位于可执行文件所在的文件夹中,则可以使用AppDomain.CurrentDomain.BaseDirectory构建它。

答案 1 :(得分:7)

你试过了吗?

asmRule = Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Rule.dll"));

答案 2 :(得分:2)

检查生产服务器的system32文件夹中是否有名为Rule.dll的文件。在尝试从Application文件夹加载之前,可能会发生“探测”或尝试从系统文件夹加载程序集。

这是MSDN中LoadFrom列出的缺点:

  

如果装载了装配体   LoadFrom和探测路径   包括具有相同组件的组件   身份但不同的位置,   InvalidCastException的,   MissingMethodException,或其他   可能会发生意外行为。

如果是这种情况,并且您无法从system32中删除Rule.dll,则可以指定程序集的完整路径。

答案 3 :(得分:1)

将任务设置为'Start In'与exe相同的文件夹(在Windows 7上,这是在您配置要运行的应用程序的路径的属性页上) - 这样当前文件夹(来自环境) )应用程序运行时与应用程序文件夹相同。然后.Net应该在解析非根路径时使用该文件夹。

我相信,您所看到的是一个常见问题,您也可以使用快捷方式。

即 - 启动文件夹设置为与任务调度程序的根相同 - 其启动dll位于c:\ windows \ system32

“它在我的机器上工作(tm)”的事实可能是因为当你在本地调试它时,你是直接运行它吗?

这里建议使用BaseDirectory的其他答案也可以。

同样,您也可以将代码更改为使用完整的程序集名称,只需使用Assembly.Load即可。但是,如果该DLL的版本/ culture / publickeytoken将来发生更改,则会中断。当然,可以通过使用.config文件来提供要加载的DLL的名称而不是硬编码来减轻这种情况。哪个 - 无论如何 - 都是很好的做法。