Microsoft C#编译器(CSC.exe)是否有输出中间语言文件的选项?有点像GCC中的-S开关吗?
我已经看到了很多与我如何调用这样的方法相关的问题.我没有找到的是如何通过反射或csharp中的任何其他方法调用方法的不同选项的列表.
有人能详细解释在csharp中动态调用方法的不同方法吗?从反射到发射IL以及其间的任何其他方式.我想知道在资源方面从最昂贵到最便宜的所有不同方式.
我已阅读“您将单元测试放在同一个项目还是另一个项目中吗?”的答案。当时(大约 10 年前)的共识是将单元测试放在与正在测试的代码不同的项目中。给出的主要原因是避免部署非生产代码,这是相当合理的。
从那时起,事情发生了很大变化,至少对于基于 JavaScript 的项目来说,在代码旁边进行测试是常态,而且实际上大多数人认为这是非常可取的。但我不会在这里讨论优点,因为这不是这个问题的目的。
假设我们对 C# 想要同样的东西,但仍然避免将测试代码部署到产品中,那么我们是否可以在 IL 级别编织一些编译后魔法,以在构建过程中从二进制文件中删除测试?例如,我们可以使用该[TestFixture]属性搜索并销毁二进制文件中的所有类吗?
我们可以利用 Roslyn 的某些功能来实现同样的目的吗?
或者,我们还可以采取其他方法吗?
C# 编译器在从进行转换时是否有任何理由发出conv.r8?double -> double
这看起来完全没有必要(从 int -> int、char -> char 等进行转换)不会发出等效的转换指令(正如您在该I2I()方法生成的 IL 中看到的那样)。
class Foo
{
double D2D(double d) => (double) d;
int I2I(int i) => (int) i;
}
Run Code Online (Sandbox Code Playgroud)
IL 的结果为:
.class private auto ansi '<Module>'
{
} // end of class <Module>
.class private auto ansi beforefieldinit Foo
extends [System.Private.CoreLib]System.Object
{
// Methods
.method private hidebysig
instance float64 D2D (
float64 d
) cil managed
{
// Method begins at RVA 0x2050 …Run Code Online (Sandbox Code Playgroud) 任何人都可以建议任何良好的资源开始使用IL.特别是如果有人知道任何好书或截屏,我会很感激反馈.
我正在使用System.Reflection.Emit,在某些时候我想从MethodBuilder创建一个委托:
MethodBuilder fooBuilder = createFooMethodBuilder();
ILGenerator ilGenerator = ...
Type delegateType = typeof(DelegateType);
LocalBuilder delegateVar = ilGenerator.DeclareLocal(delegateType);
//Somehow create emit instructions to create delegate from fooBuilder
//Store delegate in delegateVar using
Run Code Online (Sandbox Code Playgroud)
我可以发现从静态函数创建委托使用这样的东西:
ldnull
ldftn void class Test.MainClass::bar()
newobj instance void class Test.DelegateType::'.ctor'(object, native int)
Run Code Online (Sandbox Code Playgroud)
但是现在我被卡住了.我需要一种方法来修改MethodBuilder然后我需要一种方法来发出以下行的指令.我不知道如何获得一个接受原生int的构造函数.
有什么建议?
我想将C++程序编译为中间代码.然后,我想用当前处理器的所有资源编译中间代码.
第一步是使用优化(-O2)编译C++程序,运行链接器并执行大部分编译过程.此步骤必须独立于操作系统和体系结构.
第二步是使用处理器的优化和特殊指令(-march = native),为当前计算机的操作系统和处理器编译第一步的结果,而不使用原始源代码.第二步应该是快速且软件要求最低.
我可以做吗?怎么做?
编辑:
我想这样做,因为我想分发一个独立于平台的程序,它可以使用处理器的所有资源,而不需要原始的源代码,而不是为每个平台和操作系统分发编译.如果第二步快速而简单,那将是件好事.
相同架构的处理器可能具有不同的功能.X86处理器可能有SSE1,SSE2或其他,它们可以是32位或64位.如果我为通用X86编译,它将缺乏SSE优化.多年以后,处理器将具有新功能,并且需要针对新处理器编译程序.
c++ compiler-construction optimization cross-platform intermediate-language
我有一个用C编写的项目,我希望将其转换为Perl.我的一个朋友建议使用LLVM.我使用Clang将我的C代码编译为LLVM程序集.现在我正在尝试将此中间表示转换为Perl,但我似乎无法找到它的任何后端.有人会指出我正确的方向吗?
我正在使用 CMake 为我的 C 编译启用 IPO(过程间优化):
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这会导致-flto添加编译器标志。然而,它还补充说-fno-fat-lto-objects:这意味着生成的目标文件将只有中间代码,而不是同时包含正确编译的代码和中间代码;这意味着链接器必须支持我的系统编译器的中间表示并且能够感知 IPO/LTO。
我没有要求-fno-fat-lto-objects,也不想。我可以让 CMake 不添加此选项吗?
c# ×5
.net ×3
compilation ×3
c++ ×2
cil ×2
c ×1
clang ×1
cmake ×1
csc ×1
delegates ×1
invocation ×1
llvm ×1
llvm-ir ×1
lto ×1
methods ×1
optimization ×1
perl ×1
reflection ×1
roslyn ×1
unit-testing ×1