我正在尝试在新机器上安装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的引用。
任何帮助都将不胜感激。
答案 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
文件(根据正确的版本号进行调整)具有用于设置JavaVendor
和JavaInstallation
变量的行:
<Antlr4JavaVendor Condition="'$(Antlr4JavaVendor)'==''">JavaSoft</Antlr4JavaVendor>
<Antlr4JavaInstallation Condition="'$(Antlr4JavaInstallation)'==''">Java Runtime Environment</Antlr4JavaInstallation>
因此,至少就我而言,相应的注册表设置位于HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
要修复错误的注册表,请执行以下操作:
CurrentVersion
的值(在我的情况下为1.8.0_91
)具有相应的键JavaHome
中的HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8.0_91
键(替换为您的版本)具有有效Java安装的目录路径。请记住,Visual Studio是32b进程,默认情况下,它将通过查找32b版本的JRE运行Antlr4。如果由于某种原因要在Visual Studio外部使用64b进程构建解决方案,则使用64b版本的注册表。