【问题标题】:Interfacing both Debug and Release DLLs with the same C# code in SWIG?在 SWIG 中使用相同的 C# 代码连接调试和发布 DLL?
【发布时间】:2019-09-26 19:16:05
【问题描述】:

SWIG 允许您使用 -dllimport 命令行参数指定要在 C# 中导入的 DLL。

如果导入一个名称取决于它是 Debug 版本还是 Release 版本的 DLL 会怎样?遵循 Microsoft 约定将 d 后缀附加到调试版本的 DLL 会发生这种情况,例如ucrtbase.dll 用于发布版本,ucrtbased.dll 用于调试。

如果-dllimport 允许指定一个符号常量,那么该常量的值可能取决于是否定义了DEBUG,但似乎并非如此。

【问题讨论】:

  • 我不确定在这里使用预处理器指令是否有帮助 - 当 SWIG 运行时,它不知道您是否正在使用 DEBUG 编译 DLL 本身。

标签: c# swig dllimport


【解决方案1】:

我认为你可以使用静态构造函数和the SetDllDirectory of suggestion of this this answer 做你想做的事。

为了测试这一点,我把这个例子放在一起:

%module foobar

%pragma(csharp) imclasscode=%{
  [global::System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  static extern bool SetDllDirectory(string lpPathName);

  static $imclassname() {
    if (isDebug)
      SetDLLDirectory("path/to/directory/with/debugDll");
    else
      SetDLLDirectory("path/to/directory/with/regularDll");
  }
%}

您必须像这样使用 SWIG 构建它才能suppress the default static constructor

swig3.0 -DSWIG_CSHARP_NO_IMCLASS_STATIC_CONSTRUCTOR -csharp test.i

你将如何区分实际代码中的isDebug 我不太清楚 - 可能使用this to find the current HMODULE 然后GetModuleFilename 看看它是否是你的调试版本。

【讨论】:

  • 谢谢,但这不起作用,因为 DLL 有不同的名称。问题在于 SWIG 在 DllImport 中使用的 DLL 名称,它是一个文字字符串。
  • @Elena 这正是我的意思,我认为尽管有固定的文字字符串,您仍可以使其工作:通过使用两个不同的目录,重命名它们,使它们每个具有相同的名称,然后选择哪个目录在加载时使用。
  • 您可以使用-dllimport '"+somefunction()+" 调用 swig,但据我所知,在 C# 注释中这样做实际上是不合法的。
猜你喜欢
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2020-03-06
  • 2018-06-29
  • 2010-11-27
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多