我正在使用VSTO for Microsoft项目开发一个加载项,我有一个托管c ++ dll,它包含一个未管理的c ++ dll。我需要部署两个版本的托管c ++ dll,一个用于64位,一个用于32位。我正在使用Assembly.LoadFrom(path)加载适当的dll,具体取决于我运行的Office版本。这一切似乎都适用于我的开发机器,这是一台运行64位办公室的64位机器。以下是有问题的代码:
try
{
//This will return true so I know the file exists
bool fileExists = File.Exists(path);
//This will throw a file not found exception
keyModAssembly = Assembly.LoadFrom(path);
}
catch (FileNotFoundException e)
{
}
我已经三次检查路径并且文件存在并且是正确的32位dll。这一切在我的64位机器上工作正常但在我试图测试32位版本时在xpmode中失败。
任何建议都将不胜感激。
提前致谢。
修改
为了回应Phillip关于可能找不到非托管dll的建议,我使用LoadLibraryW(路径)将非托管dll加载到范围内。
// this is not throwing an exception so I know the unmanaged dll is there.
if (!File.Exists(unmanagedPath))
throw new FileNotFoundException();
LoadLibraryW(unmangedlibPath);
答案 0 :(得分:1)
是否可以正确加载包装程序集(我假设是在您的示例中指向的路径),但是找不到它引用的本机DLL?您没有在代码中检查那个。通常,错误消息显示'Assembly或其中一个依赖项未找到'。
调查此问题的一个好方法是使用SysInternals工具中的 procmon 来监视文件系统访问(它将告诉您系统在哪里查找32位DLL)或使用Windows中的 Fushion 工具。