无法加载文件或程序集
这是我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
你试过:
asmRule = Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Rule.dll"));
我会试试看,谢谢 – 2010-07-06 14:42:09
设置为“启动”的文件夹中的exe任务(在Windows 7,这是在其上配置应用程序的路径要运行的属性页上) - 这种方式在当前文件夹(来自环境)在应用程序运行时与应用程序文件夹相同。 .Net应该在解析非根路径时使用该文件夹。
我相信你所看到的是一个常见问题,你也可以通过快捷方式获得。
那就是 - 启动文件夹被设置为一样的任务调度的根源 - 其启动DLL是在C:\ Windows \ System32下
这就是它的工作原理在我的机器上的事实(TM )'大概是因为当你在本地调试时,你直接运行它?
其他的答案在这里,建议使用BaseDirectory也将工作。
同样,您也可以将代码更改为使用完整程序集名称,并简单地使用Assembly.Load
。但是,如果该DLL的version/culture/publickeytoken将来发生更改,则会中断此操作。当然,这可以通过使用.config文件来提供要加载的DLL的名称,而不是对其进行硬编码来缓解。无论如何,这是很好的做法。
感谢您的详细解释 – 2010-07-06 14:49:47
方法LoadFrom
将使用Environment.CurrentDirectory
来构建将被加载的程序集的完整路径。当前目录与应用程序基本路径不同。
您应该提供LoadFrom
方法的完整路径,如果该文件位于相同的文件夹中,则可以使用AppDomain.CurrentDomain.BaseDirectory
来构建该文件,然后使用可执行文件。
是的,这是解决方案,谢谢 – 2010-07-06 14:52:16
检查生产服务器的system32文件夹下一个名为Rule.dll文件。从“应用程序”文件夹尝试加载之前,可能发生“探测”或尝试从系统文件夹加载程序集。
这是LoadFrom在MSDN上市缺点:
如果一个组件被加载有 LoadFrom,和探测路径 包括具有相同 身份,但不同的位置的组件,一个 InvalidCastException的, MissingMethodException或其他 可能会出现意外的行为。
如果是这种情况,并且无法从system32中删除Rule.dll,那么您可以指定程序集的完整路径。
感谢有关缺点的解释,我会牢记在心 – 2010-07-06 14:50:59
奇数。看看fuslogvw.exe是否能告诉你一些东西。 – 2010-07-06 14:40:01