Antlr4 C#构建错误

时间:2013-10-30 20:58:56

标签: c# antlr antlr4

我正在尝试在新机器上安装Antlr4但是我收到以下构建错误:

  

C:\ antlrtest \ antlrtest \ Reference \ Antlr4 \ Antlr4.targets(129,5):error AC1000:未知的构建错误:对象引用未设置为对象的实例。

这是有问题的代码:

<Antlr4ClassGenerationTask
  ToolPath="$(Antlr4ToolLocation)"
  BuildTaskPath="$(Antlr4BuildTaskLocation)"
  OutputPath="$(IntermediateOutputPath)"
  TargetLanguage="%(Antlr4.TargetLanguage)"
  TargetFrameworkVersion="$(TargetFrameworkVersion)"
  TargetNamespace="%(Antlr4.CustomToolNamespace)"
  SourceCodeFiles="@(Antlr4)"
  ContinueOnError="$(_IntellisenseOnlyCompile)"
  TokensFiles="@(Antlr4Tokens)"
  AbstractGrammarFiles="@(Antlr4AbstractGrammar)"
  LanguageSourceExtensions="$(DefaultLanguageSourceExtension)"
  GenerateListener="%(Antlr4.Listener)"
  GenerateVisitor="%(Antlr4.Visitor)"
  ForceAtn="%(Antlr4.ForceAtn)"
  AbstractGrammar="%(Antlr4.Abstract)">

  <Output ItemName="Antlr4GeneratedCodeFiles" TaskParameter="GeneratedCodeFiles" />
</Antlr4ClassGenerationTask>

我认为我遵循了正确的程序:

我从VS 2012网站安装了Antlr的扩展程序。 然后我编辑了项目文件以指向参考。 然后我添加了对Runtime DLL的引用。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

所以今天我遇到了这个问题,并且已经把头发拉过来了很长一段时间。对我来说,解决方案是安装32位和64位版本的Java SDK。

最初我只安装了64位版本。它在我安装了32位之后立即开始工作。

希望能有所帮助。

答案 1 :(得分:0)

此错误是由Antlr4找不到合适的Java版本引起的。在Windows计算机上,Antlr4首先检查注册表,然后再检查环境变量以确定Java的合适位置。

在遇到相同问题之前不久,我一直在整合计算机上的许多Java Runtime Environment实例。我有很多,并且将它们分别缩减为1个实例,分别是64b JRE和32b JRE。我删除了其余的,只是删除了它们的文件夹。随后,我检查了用户和系统环境变量(特别是JAVA_HOME)是否仍指向有效的Java目录。

但是我没有意识到有些注册表项也必须更新。重新安装Java可能会修复注册表项,但我恢复到只手动修复它们。

因此Antlr4代码中的适当位置是https://github.com/tunnelvisionlabs/antlr4cs/blob/master/runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTaskInternal.cs#L144

       private string JavaHome
        {
            get
            {
#if !NETSTANDARD
                string javaHome;
                if (TryGetJavaHome(RegistryView.Default, JavaVendor, JavaInstallation, out javaHome))
                    return javaHome;

                if (TryGetJavaHome(RegistryView.Registry64, JavaVendor, JavaInstallation, out javaHome))
                    return javaHome;

                if (TryGetJavaHome(RegistryView.Registry32, JavaVendor, JavaInstallation, out javaHome))
                    return javaHome;
#endif

                if (Directory.Exists(Environment.GetEnvironmentVariable("JAVA_HOME")))
                    return Environment.GetEnvironmentVariable("JAVA_HOME");

                throw new NotSupportedException("Could not locate a Java installation.");
            }
        }

#if !NETSTANDARD
        private static bool TryGetJavaHome(RegistryView registryView, string vendor, string installation, out string javaHome)
        {
            javaHome = null;

            string javaKeyName = "SOFTWARE\\" + vendor + "\\" + installation;
            using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
            {
                using (RegistryKey javaKey = baseKey.OpenSubKey(javaKeyName))
                {
                    if (javaKey == null)
                        return false;

                    object currentVersion = javaKey.GetValue("CurrentVersion");
                    if (currentVersion == null)
                        return false;

                    using (var homeKey = javaKey.OpenSubKey(currentVersion.ToString()))
                    {
                        if (homeKey == null || homeKey.GetValue("JavaHome") == null)
                            return false;

                        javaHome = homeKey.GetValue("JavaHome").ToString();
                        return !string.IsNullOrEmpty(javaHome);
                    }
                }
            }
        }
#endif

您的.\packages\Antlr4.CodeGenerator.4.6.3\build\Antlr4.CodeGenerator.targets文件(根据正确的版本号进行调整)具有用于设置JavaVendorJavaInstallation变量的行:

    <Antlr4JavaVendor Condition="'$(Antlr4JavaVendor)'==''">JavaSoft</Antlr4JavaVendor>
    <Antlr4JavaInstallation Condition="'$(Antlr4JavaInstallation)'==''">Java Runtime Environment</Antlr4JavaInstallation>

因此,至少就我而言,相应的注册表设置位于HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment

要修复错误的注册表,请执行以下操作:

请记住,Visual Studio是32b进程,默认情况下,它将通过查找32b版本的JRE运行Antlr4。如果由于某种原因要在Visual Studio外部使用64b进程构建解决方案,则使用64b版本的注册表。