System.IO.FileNotFoundException 和 Pivotal.Gemfire.dll

System.IO.FileNotFoundException with Pivotal.Gemfire.dll

我正在将使用 Geode 的 C# windows 服务安装到 UAT Windows 2012 服务器上。引用的 dll(如 log4net、newtonsoft.json 和 QuickFix)正常工作,但 Pivotal.Gemfire.dll

除外

当我启动服务时,我得到 System.IO.FileNotFoundException: Could not load file or assembly 'Pivotal.Gemfire.dll' or one of its dependencies. The specified module could not be found. File name: 'Pivotal.Gemfire.dll'

现在 Gacutil 未随 Win Server 2012 一起提供。我已尝试安装 Windows SDK 和 .Net SDK,但未找到 Gacutil 可执行文件。所以我尝试使用 powershell 将 dll 放入 GAC,如下所示:

[System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
$publish = New-Object System.EnterpriseServices.Internal.Publish
$publish.GacInstall("D:\Pivotal.Gemfire.dll")

我试过regsvr32 Pivotal.Gemfire.dll各种口味

我已经尝试在 https://github.com/apache/geode-native/tree/develop/executables/GacInstall 处编译和 运行ning GacInstall 可执行文件。它说 Installation completed successfully. 但是当我尝试 运行 服务,或尝试 powershell:

([system.reflection.assembly]::loadfile("D:\Pivotal.Gemfire.dll")).FullName

我得到同样的错误。

我试过使用运行时间程序集绑定的私有程序集

<runtime>
<assemblyBinding
   xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Apache.Geode" publicKeyToken="null" culture="neutral" />
    <codeBase version="9.1.1-build.2" href="file://Pivotal.Gemfire.dll"/>
  </dependentAssembly>
</assemblyBinding>
</runtime>

以及根据 Implementing Shared Assembly 的各种名称 Pivotal.GemfireApache.Geode.Client,但总是出现相同的错误。

有什么想法吗?谢谢...

更新:确保你有 x86 和 x64 位 C++ 包回到 2013(对于旧版本的 Geode Net 客户端)

我下载了以前版本的 Geode,9.0.7,名为 Gemstone.Gemfire.Cache.dll 并得到了同样的错误,但那个版本在同一目录中包含一个 Gemstone.Gemfire.Cache.xml。如果我将 xml 文件放到我的 bin 目录中,错误就会停止并且服务会正常启动。

所以 like this 问题是 dll 附带的冗余 xml 文件。我通过创建一个新的虚拟 xml 文件 Pivotal.Gemfire.xml

解决了这个问题
<?xml version="1.0"?>
<doc>
</doc>

这个问题在另一个安装中再次发生。上面使用 xml 文件的答案没有解决它,通过下载 Native Client 的 9.0.7 版本,Gemstone.Gemfire.Cache.dll 然后 运行

解决了

.\gacutil /if C:\Gemstone.Gemfire.Cache.dll

返回 Assembly successfully added to the cache 然后删除较早版本的 dll,但保留由于 a strong name issue 我无法进入 GAC 的较新版本 Pivotal.Gemfire.dll。这种将早期版本的 dll 放入 GAC 的奇怪解决方法允许 GAC 找到并使用更高版本...

对我来说,标记的答案不起作用。

我必须下载 DependencyWalker,这让我明白了 Pivotal.Gemfire.dll 无法正常工作的原因。丢失的 DLL 之一来自:

Visual C++ Redistributable Packages for Visual Studio 2013

安装 64x 位后,应用程序开始运行。

我在本地构建的 Geode Native 再次发生这种情况,当它在新的 Windows 上 运行 10 安装 dependency walker 显示缺少 MSVCP140D.DLL VCRUNTIME140D.DLL和 UCRTBASED.DLL 在这里

D 与在调试模式下构建客户端有关。 问题与 How can I install a Visual Studio C++ redistributable if it is missing? 有关,答案是要么获取 dll 的发布版本,要么转到 Visual Studio 安装程序,修改,导航到单个组件 -> 编译器,构建工具,然后 运行次,并检查 MSVC v 140 VS 2015 C++ 构建工具

我还有一次遇到这种情况,我不得不删除对作为本机客户端构建的 Apache Geode dll 的引用和文件,然后再次引用它们。