无法加载文件或程序集

问题描述:

这是我ERRORMESSAGE:无法加载文件或程序集

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

问题是相同的exe在我的开发环境中工作,但不在生产性服务器上。该程序是一个应该在Windows Server 2008上作为计划任务运行的工具。它包含一个exe文件,一个名为Database.dll和Rule.dll的文件。 exe应该在代码隐藏中动态加载Rule.dll,但只有从Task Scheduler启动时才会出现上述错误。为什么它看起来在System32文件夹中,而不是在应用程序文件夹中?这是一个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 
+1

奇数。看看fuslogvw.exe是否能告诉你一些东西。 – 2010-07-06 14:40:01

你试过:

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

我会试试看,谢谢 – 2010-07-06 14:42:09

设置为“启动”的文件夹中的exe任务(在Windows 7,这是在其上配置应用程序的路径要运行的属性页上) - 这种方式在当前文件夹(来自环境)在应用程序运行时与应用程序文件夹相同。 .Net应该在解析非根路径时使用该文件夹。

我相信你所看到的是一个常见问题,你也可以通过快捷方式获得。

那就是 - 启动文件夹被设置为一样的任务调度的根源 - 其启动DLL是在C:\ Windows \ System32下

这就是它的工作原理在我的机器上的事实(TM )'大概是因为当你在本地调试时,你直接运行它?

其他的答案在这里,建议使用BaseDirectory也将工作。

同样,您也可以将代码更改为使用完整程序集名称,并简单地使用Assembly.Load。但是,如果该DLL的version/culture/publickeytoken将来发生更改,则会中断此操作。当然,这可以通过使用.config文件来提供要加载的DLL的名称,而不是对其进行硬编码来缓解。无论如何,这是很好的做法。

+0

感谢您的详细解释 – 2010-07-06 14:49:47

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

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

+0

是的,这是解决方案,谢谢 – 2010-07-06 14:52:16

检查生产服务器的system32文件夹下一个名为Rule.dll文件。从“应用程序”文件夹尝试加载之前,可能发生“探测”或尝试从系统文件夹加载程序集。

这是LoadFrom在MSDN上市缺点:

如果一个组件被加载有 LoadFrom,和探测路径 包括具有相同 身份,但不同的位置的组件,一个 InvalidCastException的, MissingMethodException或其他 可能会出现意外的行为。

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

+0

感谢有关缺点的解释,我会牢记在心 – 2010-07-06 14:50:59