3

我正在尝试在新机器上安装 Antlr4,但出现以下构建错误:

C:\antlrtest\antlrtest\Reference\Antlr4\Antlr4.targets(129,5):错误 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 安装了扩展。然后我编辑了项目文件以指向引用。然后我添加了对运行时 DLL 的引用。

任何帮助,将不胜感激。

4

2 回答 2

1

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

在我遇到同样的问题之前不久,我一直在整合我计算机上的许多 Java 运行时环境实例。我有很多,我将它们缩减为每个 64b JRE 和 32b JRE 的 1 个实例。我只删除了他们的文件夹就删除了其余部分。随后我检查了我的用户和系统环境变量(特别是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 进程,默认情况下,它将通过查找 JRE 的 32b 版本来运行 Antlr4。如果出于某种原因,您正在使用 64b 进程在 Visual Studio 之外构建解决方案,则使用 64b 版本的注册表。

于 2019-08-02T08:57:20.317 回答
1

所以我今天遇到了这个,把头发拉了很长一段时间。我的解决方案是安装 32 位和 64 位版本的 Java SDK。

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

希望对某人有所帮助。

于 2016-04-05T22:20:13.230 回答