我两天前在微软社区发布了这个问题.我有了一些好主意,做了一些实验,但还是失败了.为了获得更多帮助,我决定在这里发布这个问题.(原职务:Is it possible for a process to load two dll with different versions?)
我开发了一个word all-in应用程序,它是一个dll
,可以由word和一些与word兼容的应用程序加载(在这个问题中,我称它为类word应用程序,它们使用相同的ooxml标准).我的加载项使用CEF.net binding cefglue
(它反过来使用CEF
(chromium嵌入框架))来呈现一些web内容.下面是我的外接程序项目中的一些详细信息.
此加载项的平台目标是Any CPU
,由类似word的应用程序加载.启动时,我通过调用Environment.Is64BitProcess
判断此加载项是在32位环境还是64位环境中加载的.之后,我为libcef.dll
和其他chromium库设置了适当的库路径,这取决于加载外接程序dll的应用程序是64位还是32位.例如,在64位word中,我的加载项加载64位libcef.dll
.使用伪代码的一些详细信息:
// Files in cef library folder
// locales/
// swiftshader/
// cef.pak
// cef_100_percent.pak
// cef_200_percent.pak
// cef_extensions.pak
// chrome_elf.dll
// d3dcompiler_47.dll
// devtools_resources.pak
// icudtl.dat
// libcef.dll
// libEGL.dll
// libGLESv2.dll
// ...
private _cefPath;
void FindLibraryPath() {
bool is64BitEnv = Environment.Is64BitProcess;
SetLibraryAndResourcePath(is64BitEnv); // set _cefPath and other path here
}
void InitializeCef() {
// Load cef library
// this method use LoadLibraryEx with the flag
// LOAD_WITH_ALTERED_SEARCH_PATH to load libcef.dll
CefRuntime.Load(_cefPath);
// other statements for cef initialization
...
}
private void ThisAddIn_Startup(object sender, System.EventArgs e) {
FindLibraryPath();
InitializeCef();
}
这在Microsoft Word中运行良好,但不幸的是,这在类似Word的应用程序中出现了一些问题.原因如下:
Libraries my addin loads
myaddin.dll
(.net)->;头孢胶.dll(.net)->;libcef.dll
(native dll,版本67)->;其他chromium本机dll
Libraries word-like app loads
|-&燃气轮机;myaddin.dll
(.net)->;cefglue.dll
(.net)->;libcef.dll
(native dll,版本67)->;其他chromium本机dll
(->
代表loads
,|
代表加载DLL的独立可能路径)
我使用绝对路径加载libcef.dll
,如果我先加载这个库,这个类似word的应用程序不会加载它自己的libcef.dll
(LoadLibraryEx
的内置规则?),它计划使用我的libcef.dll
然后崩溃,毕竟它需要87版.如果word like应用程序先加载libcef.dll
,我的加载项将不会加载版本67 libcef.dll
,那么我会得到version mismatch
异常.
总而言之,我需要的是将相同名称但不同版本libcef.dll
与类似应用程序的单词隔离开来,使其无法感知我的加载项加载的同名DLL.一些 idea ?谢谢