【问题标题】:Is it possible to use late binding on a COM object inside a T4 template?是否可以在 T4 模板内的 COM 对象上使用后期绑定?
【发布时间】:2012-07-02 15:09:49
【问题描述】:

我的 T4 模板实例化了一个 Excel COM 对象以读取一些单元格值并从中创建 C# 类。我首先用常规 C# 编写了 Excel 读取逻辑,效果很好。我在这个测试中使用的代码 sn-p 是:

Worksheet xlWorkSheet;
string cellContents = xlWorkSheet.Cells.Item[1, 1].Value;

不过,将测试代码移植到 T4 模板中是行不通的。显示如下错误:

Error 1: Compiling transformation: 'object' does not contain a definition for 'Value' and no extension method 'Value' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

我解决这个问题的唯一方法是添加一些手动转换:

string cellContents = (xlWorkSheet.Cells.Item[1, 1] as Range).Value as string;

我的印象是 T4 使用“常规”C# 编译器,因此能够像常规代码一样处理动态绑定。但显然,存在差异。在这种情况下,我可以解决我的问题,因为我能够猜测要转换为哪种类型。但总的来说,情况并非如此。有没有办法让这种后期绑定在 T4 模板中工作?

【问题讨论】:

  • 你用的是什么版本的t4?
  • 不确定如何检查 T4 的版本,但我在带有 .NET 4.0 的 Visual C# 2010 Express 中使用它
  • 常规 C# 可以使用 'dynamic' 关键字处理动态绑定,T4 也可以。没有也无法推断。如果您将工作表定义为动态的,那么您应该很好。
  • 我确实在常规 C# 和 T4 之间看到了不同的结果——无需在 C# 中将任何内容定义为 dynamic,我引用的行可以正常工作。我尝试在 T4 中将 xlWorkSheet 更改为 dynamic,但这也导致了错误:Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or importedCompiling transformation: One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll?。我没有错过这些引用,并且导入建议的类型也不起作用。
  • @GarethJ 你是对的,我还必须添加一些程序集引用才能使其正常工作(所以我缺少对Microsoft.CSharpSystem.Core 的引用) .谢谢!

标签: c# .net c#-4.0 t4


【解决方案1】:

T4 和 C# 都可以使用 'dynamic' 关键字处理动态绑定。没有这个关键字也不能推断出来。

但是,在常规 IDE 中,可以在程序集引用上设置标志“嵌入互操作类型”。此功能将引用的互操作类型直接复制到使用程序集中,并在运行中翻译“对象”引用到“动态”。

因此,问题中的示例代码在 IDE 中以普通 C# 编译,因为“Item”集合被转换为返回“动态”。

T4 的“汇编”指令没有等效标志,因此您必须手动将表达式声明为动态。为此,您还必须在模板中包含以下 assembly 指令:

<#@ assembly name="System.Core" #>
<#@ assembly name="Microsoft.CSharp" #>

【讨论】:

  • 还有另一种解决方法,但它非常难看。您可以使用 T4 的 compilerOptions 参数将等效于“嵌入互操作类型”标志的命令行发送到编译器。您将删除对互操作 DLL 的组合引用,而是将 followign 参数添加到您的模板指令中。不幸的是,没有环境变量就需要完整的路径。
猜你喜欢
  • 2010-10-21
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
相关资源
最近更新 更多