从 VB.Net DLL 引用 DLL

Referencing DLLs from a VB.Net DLL

我有一个 Visual Studio 解决方案,我正在尝试对其部署进行测试。该解决方案中有多个项目,并引用了 .Net 框架和其他地方的一堆不同组件。我的所有组件都在 C# 中,除了一个在 VB.Net 中(将在某个时候升级,但需要一次完成并且很大)。

项目结构为:

在我的开发机器上一切正常。但是,当我部署到测试机器时,它是 Windows 10 + 更新,并且故意没有互联网连接(有效测试),当 Dolphin 组件中的 运行 部分程序时出现问题.

测试机上的代码错误为:

oValue = New SqlGeometry() <-- this does not error
oValue.Parse("LINESTRING (100 100, 20 180, 180 180)") <--- this errors

错误是:

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

我希望在 AppData 和 AppBuilder 中使用 SqlGeometry 和 SqlGeography。我在与 EXE 和 DLL 相同的文件夹中同时拥有 SqlServerSpatial110.dll 和 Microsoft.SqlServer.Types.dll。

如果我尝试在 Dolphin (VB.Net) 中添加对 SqlServerSpatial110.dll 的引用,我会收到以下错误消息,表明无法完成此操作:

如果我尝试使用 regsvr32 在目标应用程序目录中在测试机器上手动注册 SqlServerSpatial110.dll,我会收到错误消息:

The module 'SqlServerSpatial110.dll' failed to load.

Make sure the binary is stored at the specified path or debug it to check for problems with the binary of dependent .DLL files.

The specified module could not be found.

SqlServerSpatial110.dll 在我的开发机器上的 System32 目录中,但不在测试机器上。我在编写清单文件方面的经验水平是 none,我希望保持这种水平。作为参考,我正在使用名为 DeployMaster 的部署产品,但这与问题无关。所有组件都设置为 x86 编译。这是一个 winforms 应用程序

简而言之,如何从 Dolphin 引用 SqlServerSpatial110.dll 以正确部署和使用它?

我认为这与 c# 和 VB.Net 没有太大关系,一旦构建,应该只有 .Net 程序集,使用什么语言应该无关紧要。

正确的解决方案应该是为需要此程序集的项目在 Microsoft.SqlServer.Types 上注册一个 nuget 依赖项。 IE。转到“Tools\Nuget Package Manager\Manage packages for solution”并在你的 dolphin 项目中安装上面的包。

这应该确保所需的 dll 从互联网下载并复制到您的输出目录,但如果您使用任何类型的安装框架,您可能需要手动包含它。

我找到了解决方法。这是winforms的解决方案。我只在网上看到过针对 Azure 或 WFC 或 asp.net 的解决方案,因此希望这可以作为其他人的指南。它要求解决方案中的所有项目都是 64 位的,但对我来说这没问题。我采取的步骤是:

  • 将所有项目更改为 x64
  • 使用 nuget 添加 Microsoft.SqlServer.Types 到涉及 SQL 空间类型的解决方案中的所有项目。
  • 在 app.config 中,包括以下内容:
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  • 在代码的早期,在应用程序中,在需要任何 SQL 空间类型之前,执行以下代码(这是 nuget 在后面显示的自述页面底部建议的代码软件包已安装):
using System.Reflection;
...
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
  • 在您的安装软件中,确保 <yourexename>.exe.config 部署到 %APPFOLDER%(您的应用程序部署到的文件夹)。
  • 此外,在 %APPFOLDER% 中包含文件:Microsoft.SqlServer.Types.dll
  • 此外,在 %APPFOLDER% 中,您需要以下结构(您应该能够从项目文件夹中复制):
%APPFOLDER%\Microsoft.SqlServer.Types.dll (14.0.1016.290)
%APPFOLDER%\SqlServerTypes\x64\msvcr120.dll (12.0.40649.5)
%APPFOLDER%\SqlServerTypes\x64\SqlServerSpatial140.dll (14.0.1016.290)

但是,我还发现 Visual Studio 在使用 64 位 class 库中的用户控件时存在问题。其症状是项目构建没有错误,但如果您尝试打开带有 64 位 UserControl 的窗体,它将显示错误。

要解决此问题,请使用配置管理器并将调试配置设置为 32 位,将发布设置为 64 位。在 Debug 配置中开发,在 (uh) Release 配置中发布。

如果有人调整有关 32 位 DLL 的构建和位置的分辨率,这对我很有用,所以请 post 或在下面对其进行 link。谢谢。