【问题标题】:How to add and use an import in a script?如何在脚本中添加和使用导入?
【发布时间】:2016-07-09 02:47:57
【问题描述】:

在下面的代码中,我需要添加我的程序集,以便脚本可以使用它的类:

var options = ScriptOptions.Default.AddImports("MyAssembly");

var code = "using MyAssembly.MyNamespace;" +
           "public class TestClass {" +
           "  public int HelloWorld(int num) {" +
           "    return 5 + num;" +
           "  }" +
           "}";

但是抛出以下异常:

抛出异常:Microsoft.CodeAnalysis.Scripting.dll 中的“Microsoft.CodeAnalysis.Scripting.CompilationErrorException” Microsoft.CodeAnalysis.Scripting.CompilationErrorException:错误 CS0246:找不到类型或命名空间名称“MyAssembly”(您是否缺少 using 指令或程序集引用?)

我也在宿主项目中添加了程序集。我也尝试了here 中的示例,但它们也不起作用。

添加程序集的正确语法是什么?

【问题讨论】:

  • 我之前尝试过.WithImports(new string[] { "namespace.Whatever" });,但没有成功。现在使用.AddReferences(typeof(namespace.Whatever).Assembly) 谢谢! :)

标签: c# roslyn roslyn-code-analysis


【解决方案1】:

下面的 sn-p 可以解决问题:

var path = Assembly.GetAssembly(typeof(MyAssembly.SomeClass)).Location;
var asm = AssemblyMetadata.CreateFromFile(path).GetReference();

var options = ScriptOptions.Default.AddReferences(asm);

以下内容也有效,它使用 Linq 获取加载的程序集:

var asm = AppDomain.CurrentDomain.GetAssemblies()
    .SingleOrDefault(assembly => assembly.GetName().Name == "MyAssembly");

然而,这会获取加载的程序集。如果您需要的程序集尚未加载,请使用Assembly.GetExecutingAssembly().GetReferencedAssemblies() 获取它们。

【讨论】:

    【解决方案2】:

    有一种更简单的方法可以实现这一点:

    ScriptOptions.Default.AddReferences(typeof(MyNamespace.MyAssembly).Assembly);
    

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2020-08-10
      • 2022-11-17
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      相关资源
      最近更新 更多