【问题标题】:C# conditional compilation if assembly exists如果程序集存在,则 C# 条件编译
【发布时间】:2016-03-08 09:42:39
【问题描述】:

我有一个项目,其引用可能存在也可能不存在。我有使用该引用的代码,我只想在程序集存在时编译它。我的想法是这样的:

#if ASSEMBLY_EXISTS
    AssemblyClass.DoSomething();
#endif

我可以在顶部放置一个#define 并根据需要评论/取消评论,但我希望它能够以某种方式知道如果它在没有我的手动干预的情况下就在那里,这让我相信#if 不适用于这种情况。是否有另一种方法可以根据程序集是否存在进行条件编译?

【问题讨论】:

  • 尝试,抓住,最后?我假设你会得到一个对象 ref。未设置为对象异常的实例,因此有一个特定的 catch 块来处理它等。这不是一种非常有效的方法,但我不知道这段代码需要快速。
  • @stuartd,这不是在运行时检查链接吗??
  • 没有预编译符号可用于确定引用程序集的存在。
  • @TTT 哎呀,是的……
  • @j-u-s-t-i-n - 如果程序集不存在,代码将无法编译。

标签: c# conditional-compilation


【解决方案1】:

也许可以在 MSBUILD 中使用条件;

它看起来像它

<PropertyGroup>
     <DefineConstants Condition="Exists('my.dll') ">$(DefineConstants);DLLEXISTS</DefineConstants>
</PropertyGroup>

并且应该在您的 .csproj 文件中走得很远。

这大致读作“如果 my.dll 存在,则通过附加 DLLEXISTS 重新定义常量”

现在应该可以了

#if DLLEXISTS
    // your stuff here
#endif

您可能需要摆弄 EXISTS 表达式以找到合适的相对路径。

【讨论】:

  • 这非常有效。对于 Exists 目录,由于引用包含在项目中,我只是准确地复制了它的路径。
  • 效果很好!可以通过卸载项目并右键单击它然后单击编辑来访问 MsBuild/.csproj 文件...doc.postsharp.net/configuration-msbuild
【解决方案2】:

不,你不能这样做。 您不能在编译时定义条件编译符号的结果。

如果你想变得花哨,你可以编写一个新程序来检测丢失的程序集并修改你的源代码。然后,您可以在项目的 Pre-build 事件中执行此程序。

源代码的修改可能只是在源文件顶部添加或删除您建议的#define。

【讨论】:

  • 我喜欢你的“花哨”想法。如果没有更简单的方法,这显然会起作用,并且似乎是一个很好的后备方案。
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2014-12-25
  • 2011-01-03
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多