我的办公室目前使用VS 2010 / .NET 4.0。我们实现了自己的ReadOnlyDictionary通用版本,我相信直到4.5才会引入本机版本。我们还在一个应用程序中对C#脚本进行了一些动态编译和运行。最近,我们创建了一个C#脚本,其中包含我们的自定义通用ReadOnlyDictionary,但是当代码被动态编译时,编译失败:
“ ReadOnlyDictionary”是“ System.Collections.ObjectModel.ReadOnlyDictionary”和“ Utilities.ReadOnlyDictionary”之间的歧义引用
模棱两可的引用指向“ System.Collections.ObjectModel”命名空间,因此我再次进行了检查,并且4.0中的该命名空间似乎未包含ReadOnlyDictionary的通用实现。我可以通过使用名称空间限定自定义ReadOnlyDictionary来解决脚本失败的问题,但是我仍然想知道为什么这样做是必要的。
我采用了相同的C#脚本,并在Visual Studios中对其进行了编译,没有任何编译错误。脚本很大,但是这里有一个简单的例子,我可以重现该问题。首先,我使用默认实现在其自己的DLL /命名空间中创建了ReadOnlyDictionary的虚拟版本:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestReadOnlyDictionary
{
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
public void Add(TKey key, TValue value)
{
throw new NotImplementedException();
}
public bool ContainsKey(TKey key)
{
throw new NotImplementedException();
}
public ICollection<TKey> Keys
{
get { throw new NotImplementedException(); }
}
public bool Remove(TKey key)
{
throw new NotImplementedException();
}
public bool TryGetValue(TKey key, out TValue value)
{
throw new NotImplementedException();
}
public ICollection<TValue> Values
{
get { throw new NotImplementedException(); }
}
public TValue this[TKey key]
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public void Add(KeyValuePair<TKey, TValue> item)
{
throw new NotImplementedException();
}
public void Clear()
{
throw new NotImplementedException();
}
public bool Contains(KeyValuePair<TKey, TValue> item)
{
throw new NotImplementedException();
}
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
throw new NotImplementedException();
}
public int Count
{
get { throw new NotImplementedException(); }
}
public bool IsReadOnly
{
get { throw new NotImplementedException(); }
}
public bool Remove(KeyValuePair<TKey, TValue> item)
{
throw new NotImplementedException();
}
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
throw new NotImplementedException();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
}
然后,我编写了一个简单的控制台应用程序,其中包含此虚拟ReadOnlyDictionary的实例,并尝试编译其自己的源代码:
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.Text;
using TestReadOnlyDictionary;
namespace TestCompile
{
class Program
{
ReadOnlyDictionary<string, string> _dictionary = new ReadOnlyDictionary<string, string>();
private static void Main(string[] args)
{
string script = @"..\..\Program.cs";
string scriptText = File.ReadAllText(script);
var providerOptions = new Dictionary<string, string>()
{
{ "CompilerVersion", "v4.0" }
};
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp", providerOptions);
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.GenerateInMemory = true;
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Core.dll");
parameters.ReferencedAssemblies.Add("System.Data.dll");
parameters.ReferencedAssemblies.Add(@"..\..\..\ReadOnlyDictionary\bin\Release\ReadOnlyDictionary.dll");
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, scriptText);
if (results.Errors.Count == 0)
Console.WriteLine("Compile succeeded: " + results.CompiledAssembly.FullName);
else
{
Console.WriteLine("Compile failed! Error count: " + results.Errors.Count);
foreach (CompilerError error in results.Errors)
Console.WriteLine(error.ErrorText);
}
}
}
}
该项目的目标是.NET Framework 4,并且构建没有错误。但是,以调试模式运行程序会创建以下输出:
编译失败!错误计数:1
“ ReadOnlyDictionary”是“ System.Collections.ObjectModel.ReadOnlyDictionary”和“ TestReadOnlyDictionary.ReadOnlyDictionary”之间的歧义引用
此版本4.0的编译器是否以某种方式引用.NET Framework 4.5?还有其他方法可以告诉编译器以4.0版为目标吗?
最佳答案
我与其他dll有类似的问题。对我来说,问题在于构建服务器没有.Net 4.0目标包,而正在默默地构建.Net 4.5版本。检查构建输出中是否有任何警告或错误。
关于c# - 定位到v4.0时对v4.5类的引用不明确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36695062/