我有三个节目-
程序1:另外使用MAPI的Microsoft外接程序.
程序2:不使用的独立执行程序使用MAPI
程序3:做的独立的使用MAPI.
这三个程序都是用C#编写的,并在某个时候使用了WinForms RichTextBox。
在安装Office 365程序的x64 Windows 8上,程序'1‘和'3’没有问题,但是程序'2‘一旦用以下堆栈构造RichTextBox控件就会崩溃:
System.IO.FileNotFoundException : C:\Program Files (x86)\Common Files\Microsoft Shared\Office15\riched20.dll
at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
at System.Windows.Forms.RichTextBox.get_CreateParams()
at System.Windows.Forms.Control..ctor(Boolean autoInstallSyncContext)
at System.Windows.Forms.TextBoxBase..ctor()
at System.Windows.Forms.RichTextBox..ctor()
<snip>反汇编RichTextBox.get_CreateParams()显示它在'riched20.dll‘上调用LoadLibrary,然后在加载模块上调用GetModuleFileName。
对于程序2,Visual告诉我它已经从路径"C:\Program \Microsoft 15\root\vfs\ProgramFilesCommonX86 86\Microsoft Shared\OFFICE15\ riched20.dll“中加载riched20.dll。
然后,对FileVersionInfo.GetVersionInfo()的调用失败,因为给定的路径不存在。
但是,程序1( outlook-addin)也从相同的路径加载了riched20.dll --但不知怎么的,它还是成功了!
没有加载MAPI的程序2运行良好,它从C:\Windows\syswow62加载riched20.dll
程序3在创建富文本框之前初始化MAPI,我知道某些MAPI函数会将当前的工作目录更改为MAPI目录。这可能解释了为什么程序3加载office的riched20.dll,而程序2加载system32副本。
我怀疑程序1工作与程序3失败的不同之处在于,路径中的vfs代表“虚拟文件系统”,因此作为Outlook外接程序运行的程序1可以使用不存在的路径找到riched20.dll。
这三个程序都与以前版本的office一起工作。
作为一种解决方案,在初始化MAPI之前自己调用‘LoadLibrary(“riced20.dll”)会使问题消失,但感觉就像一次可怕的攻击。
我也找不到关于这个'vfs‘文件路径的任何信息,以及它在互联网上的含义。
对于我自己的教育,还有人能更好地解释这里发生了什么吗?
更新:到目前为止,我已经知道这与“单击到运行”功能有关。
发布于 2013-07-26 06:00:12
解决方案是在初始化MAPI之前使用pinvoke在“riced20.dll”上调用LoadLibrary。
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr LoadLibrary(string lpFileName);
LoadLibrary("riched20");https://stackoverflow.com/questions/17332284
复制相似问题