如何将本机 DLL 包含到 WiX 安装程序的托管 DLL/自定义操作中?

发布于 2025-01-10 20:33:34 字数 696 浏览 0 评论 0原文

我正在制作一个 WiX/MSI 安装程序,它使用用 C# 编写的自定义操作 DLL。在该自定义操作中,我正在调用本机/非托管 DLL。下面是一个示例:

    [DllImport("log.dll",
        CharSet = CharSet.Unicode,
        SetLastError = true,
        CallingConvention = CallingConvention.StdCall)]
    static extern int CloseLog(IntPtr hLog);

问题是,当我的 MSI 运行并且调用自定义操作时,对 CloseLog 的调用会引发 DllNotFoundException 异常。

我可以手动将 log.dll 的链接添加到我的自定义操作 C# DLL 项目中:

在此处输入图像描述

但问题是无法指定哪个版本log.dll 从 C# 项目使用,即 x86/x64/debug/release。

那么有什么建议如何去做吗?

I'm making a WiX/MSI installer that uses a custom action DLL written in C#. Inside that custom action I'm pinvoking a native/unmanaged DLL. Here's an example:

    [DllImport("log.dll",
        CharSet = CharSet.Unicode,
        SetLastError = true,
        CallingConvention = CallingConvention.StdCall)]
    static extern int CloseLog(IntPtr hLog);

The problem is that when my MSI runs and I invoke the custom action my call to CloseLog throws the DllNotFoundException exception.

I can manually add a link to log.dll into my custom action C# DLL project:

enter image description here

But the problem is that there's no way to specify which build of the log.dll to use from a C# project, i.e. x86/x64/debug/release.

So any suggestions how to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

独享拥抱 2025-01-17 20:33:34

您可以通过在项目文件中定义 CustomActionContents 向 CA.dll 添加任何有效负载(左侧路径在 CA 中,右侧路径是您的本地路径)。

  <PropertyGroup>
    <CustomActionContents>x64\log.dll=x64\log.dll;</CustomActionContents>
  </PropertyGroup>

更新:
这在 WiX v4 中的工作原理相同。正斜杠/不起作用。

You can add any payload to the CA.dll by defining CustomActionContents in the project file like this (left path is in the CA right path is your local path).

  <PropertyGroup>
    <CustomActionContents>x64\log.dll=x64\log.dll;</CustomActionContents>
  </PropertyGroup>

Update:
This works the same in WiX v4. Forward slashes / do not work.

素罗衫 2025-01-17 20:33:34

添加 DLL 作为内容 copylocal=true ,它将包含在自定义操作的当前目录中。

MSI 与平台无关,因此如果直接 x64/Release 不适合您,您应该构建 32 位 CA 和 64 位 CA 供 32 位 MSI 和 64 位 MSI 使用。

Add the DLL as content copylocal=true and it'll be included in the current directory of the custom action.

MSI is not platform agnostic so you should build a 32bit CA and 64bit CA to be consumed by a 32bit MSI and a 64bit MSI if straight up x64/Release doesn't work for you.

度的依靠╰つ 2025-01-17 20:33:34

必须回答我自己的问题。

显然没有办法通过 UI 来做到这一点。因此,请在解决方案资源管理器中右键单击 C# 项目,然后选择卸载项目,然后在 XML 标记中找到文件名。所以事实证明,

  <ItemGroup>
    <Content Include="..\..\..\x64\Debug\log.dll">
      <Link>Properties\log.dll</Link>
    </Content>
  </ItemGroup>

您可以这样做:

  <ItemGroup>
    <Content Include="..\..\..\$(Platform)\$(Configuration)\log.dll">
      <Link>Properties\log.dll</Link>
    </Content>
  </ItemGroup>

然后再次右键单击该项目并选择重新加载项目

它不会在属性窗口中正确显示,但会根据所选配置进行编译。

Have to answer my own question.

Evidently there's no way to do this via UI. So instead right-click your C# project in Solution Explorer, and select Unload Project, then locate the file name in the XML markup. So it turns out that instead of:

  <ItemGroup>
    <Content Include="..\..\..\x64\Debug\log.dll">
      <Link>Properties\log.dll</Link>
    </Content>
  </ItemGroup>

you can do:

  <ItemGroup>
    <Content Include="..\..\..\$(Platform)\$(Configuration)\log.dll">
      <Link>Properties\log.dll</Link>
    </Content>
  </ItemGroup>

Then right-click the project again and select Reload Project.

It won't show correctly in the properties window, but it will compile according to selected configuration.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文