问题标签 [codedom]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
7371 浏览

c# - 在 csc.exe 中导致堆栈溢出 (CS1647) 的 C# CodeDom 的解决方法?

我有一种情况,我需要生成一个带有大字符串 const 的类。我无法控制的代码导致我生成的 CodeDom 树被发送到 C# 源代码,然后编译为更大程序集的一部分。

不幸的是,我遇到了这样一种情况,如果此字符串的长度在 Win2K8 x64 中超过 335440 个字符(在 Win2K3 x86 中为 926240),C# 编译器将退出并出现致命错误:

致命错误 CS1647:表达式太长或太复杂,无法在“int”附近编译

MSDN 说 CS1647 是“编译器中的堆栈溢出”(不是双关语!)。仔细观察,我确定 CodeDom “很好地”将我的字符串 const 包装在 80 个字符处。这导致编译器连接超过 4193 个字符串块,这显然是 x64 NetFx 中 C# 编译器的堆栈深度。CSC.exe 必须在内部递归地评估此表达式以“补充”我的单个字符串。

我最初的问题是:“有人知道改变代码生成器如何发出字符串的变通方法吗? ”我无法控制外部系统使用 C# 源作为中间体的事实,我希望这是一个常量(而不是而不是字符串的运行时连接)。

或者,我如何制定这个表达式,以便在一定数量的字符之后,我仍然能够创建一个常量,但它是由多个大块组成的?

完整的复制在这里:

0 投票
1 回答
404 浏览

codedom - 通过 CodeDOM 生成变量名

大家好,

请在这件事上给予我帮助:

我有一个包含我的自定义控件的表单。

在自定义控件中,我有 2 个集合引用同一个 DataSource 来获取数据。

我当前的 CodeDOM 序列化程序是这样工作的:

如您所见,objA 被实例化了 2 次。

如何解决这个问题?

我想我可以声明一个包含对 objA 的引用的变量,然后将该变量分配给 2 个集合:

但我不能确保“var”是一个唯一的名称。我怎样才能让它自动分配给我的控件(控件 1、控件 2 等)的名称?

谢谢你。

0 投票
1 回答
1660 浏览

c# - 使用 CodeDOM 的公共 getter、受保护的 setter

是否可以使用 CodeDOM 生成具有公共 getter 和受保护 setter 的属性?目标是实现类似于以下的目标。

我有一个基于 COM 的大型 API,我希望为其编译一个 .Net 包装器,以便更轻松地使用 .Net 功能,例如 LINQ、反射、继承和序列化。唯一可行的方法是通过代码生成自动化大部分工作。

这些对象包含一些我希望通过需要属性设置器的序列化公开的只读属性。但是这么长时间我还没有找到任何方法来设置 setter protected 或类似的。

一种方法可能是将属性标记为不可序列化并序列化 _Field 但由于序列化输出的一个目标是 web 我需要为私有成员分配所有可能的序列化器属性,这些属性会引导序列化器使用更清晰的名称(没有下划线)用于序列化。出于同样的原因,我相信自定义序列化是不可能的。

我可以准确地反序列化它并不重要,即。在反序列化期间/通过反序列化过程中,值保持其原始值并不重要。这些属性是只读的,只是为了通过防止 API 使用者尝试更改只读字段并想知道为什么它们对任何内容没有影响来减少混淆。

0 投票
2 回答
838 浏览

c# - 方法的 C# 字符串表示

.NET 3.0(或更早版本)中有没有办法获取方法的字符串表示形式?我知道我可以从 MethodBody 对象中获取一个 IL 字节数组,但是我有兴趣获取一个基本上代表方法体的字符串,因为它在 VS 中出现在我的眼中。

我在 CodeDom 命名空间中四处寻找,看看是否有一种方法可以在运行时将方法转换为 CodeMemberMethods,但到目前为止我已经干了。

有什么想法吗?

0 投票
6 回答
3789 浏览

c# - C# 4.0,检测是否缺少方法

我有一种情况,我想将 LinePragmas 添加到 CodeDom 对象。但有些代码 dom 对象具有 LinePragma 属性,有些则没有。

所以我想知道是否可以使用 dynamic 关键字来检测对象上是否存在属性(不抛出异常),如果存在则添加 pragma。这是我目前的方法:

更新: 我采用的解决方案是添加一个名为 Exists() 的扩展方法。我在这里写了一篇关于它的博客文章: Member Exists Dynamic C# 4.0

目的是创建一个扩展方法,该方法返回一个实现 DynamicObject 的 TryGetMember 的对象。它使用反射来返回真或假。它允许您编写如下代码:

0 投票
1 回答
924 浏览

.net - Does a CodeDom Visual Basic .NET parser exist?

Does somebody know if someone has created a Visual basic parser to CodeDom (ie, it takes VB.NET as input and create a CodeCompileUnit graph) ?

SOLUTION

I've retrieved the source code of SharpDevelop, and used their parser, it works just fine !

0 投票
6 回答
1873 浏览

c# - 使用 CodeDom 分析代码结构?

我最近在 Stackoverflow 上写了一篇文章,询问一些计算指标的 C# 库,主要是 CC ......不幸的是没有成功。所以我要自己写。我在网上搜索了可能是最好的方法,但在开始之前,我想问你如何做到这一点。

我目前介于两种方法之间

  • 给定一个源代码目录,用正则表达式或类似表达式解析源代码,以识别方法、条件语句等结构,以便能够计算 CC
  • 给定一个程序集,加载并分析它(使用 CodeDom?)

我更喜欢第二种方法,因为直接解析源代码对我来说似乎不是一个好方法。我已经阅读了集成在 .Net 框架中的 CodeDom。我知道它用于动态代码生成。我想我也可以用它来分析代码结构,不是吗?你们中是否有人有使用 CodeDom 的一些好的起点、一些提示、好的教程从哪里开始?

谢谢

编辑:或者可能是其他一些允许轻松解析源代码的实用程序(类似 DOM 的结构)。

0 投票
3 回答
2410 浏览

c# - 如何使用 CodeDom 初始化数组(或锯齿状数组)?

我正在尝试使用CodeDom生成可以执行以下操作的 C# (.Net 2.0) 代码:

在 CodeDom 中,初始化数组需要CodeArrayCreateExpression。MSDN 说:

如果一种语言允许数组的数组,则可以通过在 CodeArrayCreateExpression 中嵌套 CodeArrayCreateExpression 来创建它们。

我理解它的方式,唯一的可能性是写这样的东西:

但这会产生:

这并不完美,但如果我在生成时知道 myArray 的大小,我可以这样做,但我不知道。

我可以编写一个执行初始化的函数并在 CodeDom 中调用它,但如果我可以在纯 CodeDom 中执行它会更好。我错过了什么 ?

[编辑] 背景资料

这个想法是在两个对象表示之间自动生成一个适配器。我有一个元描述(某种 IDL)说:“我有一个容器对象,它有一个 int[][] 类型的字段”和这个容器的两个表示:

因此,生成可以适应任何数组大小的代码的问题。

0 投票
2 回答
573 浏览

c# - 我们如何使用 .Net CodeDom 创建依赖对象?

我们正在创建自己的代码来自动生成 CRUD 编码,我们需要生成一个用于 WPF 的类。为此,我们需要创建具有字段/属性作为依赖对象的类。我们如何在 .Net 3.5 中使用 CodeDom 实现这一点?

0 投票
2 回答
809 浏览

c# - 生成Code时EnvDTE和CodeDom有区别吗

我需要使用 DSL 生成和读取一些 CS 类,我采用了一种方法来使用 EnvDTE 读取 CS 文件,而我的同事使用 CodeDom 来生成 CS 文件。

它只是糖还是两者之间有很大的区别......

我主观上更喜欢 EnvDTE,但不知道“真正”的区别是什么。

信息:C#,Visual Studio 2010