- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否可以在 C# 中编写 MSIL 代码,在满足特定条件时向代码添加预处理器指令,例如 #warning
?或者也许这可以通过反射(reflection)来完成,我不知道。
我正在尝试编写一个自定义属性,如果错误地应用于类的方法或属性,将生成编译器警告。使用现有的 Obsolete
属性将不起作用,因为仅使用我的自定义属性会导致警告,而我不希望这样。我希望自定义属性构造函数检查条件,如果该条件为真,则引发编译警告。
更新:在回顾我的问题后,我认为我所要求的是不可能的,因为我混合了编译时和运行时约束。我想我最终会执行构建后任务来检查刚刚构建的 DLL 并让它在条件为真时吐出错误消息。
最佳答案
我看到这个问题来自您之前的话题。错误引用伟大的 Jamie Zawinski 的话:“有些人在遇到问题时会想“我知道,我会使用属性。现在他们有两个问题”。
属性只是带外数据,编译到程序集的元数据中。它不会影响程序执行或工具行为,除非程序或工具被明确编程为识别特定属性。它需要使用反射来做到这一点。
您需要做的是编写自己的工具。它应该在构建程序集后执行,使用项目的构建后步骤。它需要加载程序集并使用反射来迭代程序集中的类型。对于每种类型,使用 Type.GetMethods() 迭代方法并使用 MethodInfo.GetCustomAttributes() 来发现和构建可能已编程的属性。
您可以使用 Type.GetInterfaces() 来发现该类型实现了哪些接口(interface)。当您看到存在实现接口(interface)方法但缺少说明如此的属性的方法时,您现在可以提示。你的最终目标是:当你看到一个方法的属性表明它实现了一个接口(interface)方法但类型不再继承它时,你可以提示。
如果您发现任何令人反感的内容,请使用 Environment.ExitCode 使该工具无法构建。这负责执行。顺便说一句:程序员真的很讨厌破坏构建。这很可能会鼓励他们虔诚地使用该属性。或者它可能会鼓励他们编辑后期构建步骤。
关于C#:编写 MSIL 以添加预处理器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2169161/
我正在编写一个“弱事件工厂” - 将任何 Delegate 转换为具有相同签名的新委托(delegate)的代码,但在目标上实现 WeakReference。我正在使用 MSIL 来避免对 Deleg
两个混淆相关的问题: 1) 是否有任何工具可以将 F# 从 MSIL 目标形式反汇编回其源形式或接近它的形式?这不是通过默默无闻来实现安全性的尝试,但我想保护某些源代码免遭“盗窃”。 2) 我简要地查
关于 SO 上的 MSIL 有很多问题,但没有一个直接回答这个问题。 我一直在用 Textpad它确实有 MSIL 的语法定义文件,然后在命令提示符窗口中使用 ILASM。 我确实找到了对 ILIDE
我正在尝试为 .NET 平台创建我的语言的后端。前端和解释器用Delphi编写。非托管 API 只允许类型定义,但不允许发出 MSIL。 有哪些方法可以从非托管代码生成 MSIL?不使用 Reflec
是否有任何可读的最新(.net 4)MSIL 引用手册? 最佳答案 有一堆可下载的引用文档here . 包括 2006 年 6 月的 ECMA-335 公共(public)语言基础结构文档 (pdf)
在 VB.NET 中,您可以添加文件引用或项目引用。例如,如果您想使用 SQLConnection 类,那么您可以添加对 System.Data.SQLClient 的引用并导入命名空间。 这在 MS
请查看下面的 MSIL 代码: IL_00: ldstr "Hello World" IL_05: call void [mscorlib]System.Console::W
在 VB.NET 中,您可以添加文件引用或项目引用。例如,如果您想使用 SQLConnection 类,那么您将添加对 System.Data.SQLClient 的引用并导入命名空间。 这在 MSI
假设我的解决方案中有一个 C# Windows 类库,我在 VS2010 IDE 中构建它。我的 bin 目录中的输出是 X.dll 1) X.dll现阶段不包含MSIL,而是“压缩字节码”。 这是真
我正在使用 RemotingLite 库 ( see at github ) 并且 Proxy 类工厂有问题。简而言之,问题是在生成代码以返回 ValueType 对象(如用户定义的结构)时。 部分原
我正在尝试使用 Reflection.Emit(在 c# 中)创建一个新类型。 我要创建的代码类似于 public class { public static int[] A = new int
我试图弄清楚 MSIL 如何能够通过仅存储一个整数来表示对静态函数的调用。 例如,如果您添加对 Interlocked.Increment(ref someVariable) 的调用,您的 IL 将包
我只是想知道这是否可以做到。如果它不包含一些显着的性能优势,我不打算这样做。我是一名网络和游戏开发人员,但我通常不使用 c# 开发游戏。 最佳答案 是的,有可能 - 您可以使用 ilasm (附带 .
有人可以解释这几行 MSIL 吗?为什么它将评估堆栈中的值移到局部变量中,只是立即将其移回并返回? 以下 MSIL 代码加载单个参数(字符串),调用返回 bool 的方法,然后返回该 bool 值。我
这些问题似乎找不到好的答案。 以下是我认为我知道的和我不清楚的。 评估堆栈是一个类似于 C 风格堆栈的内存缓冲区(它是原生 int/size_t 的堆栈)吗? 评估堆栈元素可以是 32 位或 64 位
我可以访问这样的函数体中间语言: byte[] ilCodes = NestedFooInfo.GetMethodBody().GetILAsByteArray(); 我可以修改它的 IL 代码,以便
考虑以下C#代码段: static string input = null; static string output = null; static void Main(string[] args)
我有一组 MSIL/CLR 应用程序(用 C# 编写)。我正在寻找一种将它们刻录到纯硬件平台上的方法。我已经看到 Altera 有一个名为 NIOS II 的嵌入式处理器,它似乎支持 eCLR(嵌入式
在某种同行评审期间调试一些 C# 代码时,我注意到一种奇怪的行为,乍一看似乎是某种范围界定违规,但回想起来,编译器可能试图通过重用引用来节省内存。代码是: for(int i = 0; i < 10;
我尝试使用谷歌搜索和搜索 StackOverFlow,但没有看到明确的答案。如何查看我的 C# 编译成的 IL 代码?我想比较两种方法,看看它们是否产生相同的 IL。我曾看过一个非常棒的视频,内容是这
我是一名优秀的程序员,十分优秀!