【问题标题】:Load different assembly depending on build configuration根据构建配置加载不同的程序集
【发布时间】:2013-12-03 16:31:39
【问题描述】:

我在我的项目中使用Magick.NET,它会渲染游戏地图。当我为 x86 处理器构建工具和为 64 位处理器构建 Magick.NET 的 X64 版本时,是否可以加载 X86 版本?我想主要的问题是,不同版本的dll有不同的身份。

我已经编写了一个预构建事件,该事件在构建时处理正确的 dll,具体取决于所选的构建配置。我还使用Assembly.LoadFrom(); 加载了复制的程序集,但该应用程序总是抛出一个异常,即我在 VS2010 中添加到引用的程序集未找到。我不能同时添加这两个引用,因为它们具有相同的命名空间和相同的方法。

除了在 VS2010 中为每个构建配置更改引用之外,还有更好的方法来处理这个问题吗?

预编译过程:

echo."$(ConfigurationName)"|findstr /C:"x64" >nul 2>&1
if not errorlevel 1 (
   copy /Y "$(ProjectDir)lib\Magick.NET-x64.dll" "$(TargetDir)lib"
) else (
   copy /Y "$(ProjectDir)lib\Magick.NET-x86.dll" "$(TargetDir)lib"
)

在 x86 构建上加载程序集:

if (IntPtr.Size == 4)
{
    Assembly assembly = Assembly.LoadFrom("lib/Magick.NET-x86.dll");
}

例外:

System.BadImageFormatException
Magick.NET-x64, Version=6.0.0.0, Culture=neutral, PublicKeyToken=2004825badfa91ec not found

【问题讨论】:

  • 部署两个 dll 会不会打扰您?然后,您可以使用 AppDomain.AssemblyResolve 在运行时加载正确的。
  • X64 版本为 10 MB,X86 版本为 8 MB。太多了,不能同时添加它们。

标签: c# .net visual-studio-2010


【解决方案1】:

我的经验是最好完全分离 x86 和 x64 构建。因此,为每个平台/构建组合创建一个构建配置(通常会有最后四个:x86 调试、x86 发布、x64 调试、x64 发布),为解决方案中的每个项目的每个配置都有一个单独的输出目录。一开始有点费力,因为可能需要对项目文件进行一些手动调整(配置依赖的参考提示路径),但最终它导致的问题最少。

【讨论】:

  • 我有不同的构建配置(和你提到的一样),但我不想一直替换 VS2010 中的引用。
  • 错误...您不必这样做。如果您手动将 $(TargetPath)\bin\$(Configuration)\$(Platform)\Referenced.dll 之类的内容放入提示路径中,则始终有效。 Visual Studio 无法自动执行此操作,但如果您在那里使用宏,它不会报错。
  • 是的!它就像一个魅力。我已经编辑了 .csproj 文件并将提示路径更改为 lib\Magick.NET-$(Platform).dll。我不知道我可以在那里使用宏。
  • 是的,我们也花了一段时间才找到它。在 C# 中为不同的构建配置引用库时,我仍然觉得 VS 搞得一团糟。它总是适用于 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
相关资源
最近更新 更多