我的程序运行完美,除非它作为启动程序启动。当作为启动程序启动时,它无法找到第一方DLL(或其中一个依赖项)。
我得到以下异常:
无法找到文件或程序集X或其中一个依赖项:C:\ Windows \ SysWow64 \ X.dll
它正在C:\Windows\SysWOW64\
目录中而不是在本地目录C:\Program Files\MyProgram\
中查找第一方DLL。
令人困惑的部分是,如果我手动启动程序,一切正常。
如何找到此问题的根源?我尝试使用Fusion Log但它只告诉我与异常相同的事情:它只是试图从C:\Windows\SysWOW64
加载。
我读到当您的应用程序使用Assembly.Load
时可能会发生这种情况 - 罪魁祸首程序确实使用Assembly.LoadFrom
- 但同样,除非在启动时完成,否则此工作正常。
此外,罪魁祸首程序确实有一些[DllImport]
属性。
答案 0 :(得分:0)
问题与启动时使用Assembly.LoadFrom
和当前目录有关。
Assembly.LoadFrom
声明:
assemblyFile可以是当前目录的绝对值或相对值,并且程序集将加载到调用者的域中。
当程序设置为启动程序时,当前目录为
C:\Windows\SysWOW64
无论出于何种原因。
正如您可以通过输出Directory.GetCurrentDirectory()
来演示。
不使用不遵循正常探测的Assembly.LoadFrom
,而是使用Assembly.Load
,因为这会搜索包含DLL的普通目录。
加载上下文包含通过探测找到的程序集:在GAC中,在托管运行时的主机程序集存储中,或在应用程序域的ApplicationBase和PrivateBinPath中。 Load方法的大多数重载都会将程序集加载到此上下文中。
load-from上下文包含用户为其提供未通过探测搜索的目录中包含的路径的程序集。 LoadFrom,CreateInstanceFrom和ExecuteAssembly是按路径加载的方法示例。
这也解释了为什么Fusion告诉我它只是在C:\Windows\SysWOW64
中搜索DLL - 因为这是LoadFrom
所做的,只搜索给定的目录。在我的情况下是当前目录。