2

我正在用 C# 制作一个小型脚本引擎,我想知道是否有某种#compiler 指令或某种其他类似头文件的文件我可以用我的脚本文件编译以定义我的脚本文件引用的托管 Dll?

public static CompilerResults LoadScript(
    string SourceCodeFile, string[] References)
{
    var Parameters = new CompilerParameters()
    {
        GenerateExecutable = false,
        GenerateInMemory = true,
        IncludeDebugInformation = false,
    };

    Parameters.ReferencedAssemblies.AddRange(References);

    return CSharpCodeProvider.CreateProvider(
        CSharpCodeProvider.GetLanguageFromExtension(
            Path.GetExtension(SourceCodeFile)))
                .CompileAssemblyFromFile(Parameters, SourceCodeFile);
}

我希望能够消除这行代码:

Parameters.ReferencedAssemblies.AddRange(References);
并将这些信息放在我的脚本中。问题是我不一定提前知道脚本将引用什么 .dll。我目前的解决方案是解析一个看起来像这样的自定义“script.cs.refs”文件:
"System.dll","System.Data.dll","SomeOther.dll","Ect.dll"
有关找出 Visual Studio 将您对 dll 的引用存储在何处以及是否必须在单独的文件中定义它的任何帮助,如果有我应该使用的标准化格式,我可以将其加载到告诉它此信息的编译器中,将是非常感激!

4

2 回答 2

3

您不能在 C# 源代码中指定程序集引用,不。

Visual Studio 在构建项目时会将项目中的引用传递给编译器。

请注意,在使用命令行时,存在包含大量选项的响应文件的概念。这可以在命令行上指定,或者csc.resp在 .NET 框架目录中有一个默认文件,该文件具有包括引用在内的默认选项,但我怀疑它是从CSharpCodeProvider.

您可能拥有自己的“特殊注释”格式,其中列出了引用 - 解析您获得的脚本以获取这些引用,然后将它们传递进去。

于 2009-03-06T09:58:37.007 回答
2

我认为没有标准的解决方案,除了您可以采用类似 ASP.NET 的方法来引用源文件中定义的程序集。

然后你需要

  1. 解析源代码文件以查找程序集引用
  2. 将它们传递给 CompilerParameters
  3. 确保在源代码中定义引用的行不会产生编译错误。

要实现 3.,您可以在注释中定义引用。例如

//@ Assembly name="SomeOther.dll"

然后,您可以为这些 //@ 行正则表达式源代码文件并解析出程序集名称。

于 2009-03-06T10:10:49.707 回答