using System.Security.Permissions;
using Mono.Security.Cryptography;
using Mono.CompilerServices.SymbolWriter;
+using System.Linq;
#if STATIC
using IKVM.Reflection;
byte[] GetPublicKeyToken ();
bool IsFriendAssemblyTo (IAssemblyDefinition assembly);
}
+
+ public class AssemblyReferenceErrorInfo
+ {
+ public AssemblyReferenceErrorInfo (AssemblyName dependencyName, string location, string message)
+ {
+ this.DependencyName = dependencyName;
+ this.RequestingAssemblyLocation = location;
+ this.Message = message;
+ }
+
+ public AssemblyName DependencyName { get; private set; }
+ public string RequestingAssemblyLocation { get; private set; }
+ public string Message { get; private set; }
+ }
public abstract class AssemblyDefinition : IAssemblyDefinition
{
//
void CheckReferencesPublicToken ()
{
- foreach (var an in builder_extra.GetReferencedAssemblies ()) {
+ var references = builder_extra.GetReferencedAssemblies ();
+ foreach (var an in references) {
if (public_key != null && an.GetPublicKey ().Length == 0) {
Report.Error (1577, "Referenced assembly `{0}' does not have a strong name",
an.FullName);
if (ia == null)
continue;
- var references = GetNotUnifiedReferences (an);
- if (references != null) {
- foreach (var r in references) {
- Report.SymbolRelatedToPreviousError ( r[0]);
- Report.Error (1705, r [1]);
+ var an_references = GetNotUnifiedReferences (an);
+ if (an_references != null) {
+ foreach (var r in an_references) {
+ //
+ // Secondary check when assembly references is resolved but not used. For example
+ // due to type-forwarding
+ //
+ if (references.Any (l => l.Name == r.DependencyName.Name)) {
+ Report.SymbolRelatedToPreviousError (r.RequestingAssemblyLocation);
+ Report.Error (1705, r.Message);
+ }
}
}
return public_key_token;
}
- protected virtual List<string[]> GetNotUnifiedReferences (AssemblyName assemblyName)
+ protected virtual List<AssemblyReferenceErrorInfo> GetNotUnifiedReferences (AssemblyName assemblyName)
{
return null;
}
return Builder.__AddModule (moduleFile);
}
- protected override List<string[]> GetNotUnifiedReferences (AssemblyName assemblyName)
+ protected override List<AssemblyReferenceErrorInfo> GetNotUnifiedReferences (AssemblyName assemblyName)
{
return loader.GetNotUnifiedReferences (assemblyName);
}
Assembly corlib;
readonly List<Tuple<AssemblyName, string, Assembly>> loaded_names;
static readonly Dictionary<string, string[]> sdk_directory;
- Dictionary<AssemblyName, List<string[]>> resolved_version_mismatches;
+ Dictionary<AssemblyName, List<AssemblyReferenceErrorInfo>> resolved_version_mismatches;
static readonly TypeName objectTypeName = new TypeName ("System", "Object");
static StaticLoader ()
if (version_mismatch is AssemblyBuilder)
return version_mismatch;
- var v1 = new AssemblyName (refname).Version;
+ var ref_an = new AssemblyName (refname);
+ var v1 = ref_an.Version;
var v2 = version_mismatch.GetName ().Version;
if (v1 > v2) {
if (resolved_version_mismatches == null)
- resolved_version_mismatches = new Dictionary<AssemblyName, List<string[]>> ();
+ resolved_version_mismatches = new Dictionary<AssemblyName, List<AssemblyReferenceErrorInfo>> ();
var an = args.RequestingAssembly.GetName ();
- List<string[]> names;
+ List<AssemblyReferenceErrorInfo> names;
if (!resolved_version_mismatches.TryGetValue (an, out names)) {
- names = new List<string[]> ();
+ names = new List<AssemblyReferenceErrorInfo> ();
resolved_version_mismatches.Add (an, names);
}
- names.Add (new[] {
- args.RequestingAssembly.Location,
+ names.Add (new AssemblyReferenceErrorInfo (ref_an, args.RequestingAssembly.Location,
string.Format ("Assembly `{0}' depends on `{1}' which has a higher version number than referenced assembly `{2}'",
- args.RequestingAssembly.FullName, refname, version_mismatch.GetName ().FullName)
- });
+ args.RequestingAssembly.FullName, refname, version_mismatch.GetName ().FullName)));
return version_mismatch;
}
return default_references.ToArray ();
}
- public List<string[]> GetNotUnifiedReferences (AssemblyName assemblyName)
+ public List<AssemblyReferenceErrorInfo> GetNotUnifiedReferences (AssemblyName assemblyName)
{
- List<string[]> list = null;
+ List<AssemblyReferenceErrorInfo> list = null;
if (resolved_version_mismatches != null)
resolved_version_mismatches.TryGetValue (assemblyName, out list);
setup:
$(CSCOMPILE) -t:library dlls/test-679-2/test-679-lib-2.cs
$(CSCOMPILE) -t:library dlls/test-679-1/test-679-lib.cs -r:dlls/test-679-2/test-679-lib-2.dll
+ $(CSCOMPILE) -t:library dlls/test-939-common.cs -keyfile:key.snk -publicsign
+ $(CSCOMPILE) -t:library dlls/test-939-1/test-939-lib.cs -keyfile:key.snk -publicsign
+ $(CSCOMPILE) -t:library dlls/test-939-1/test-939-ref.cs -r:dlls/test-939-1/test-939-lib.dll -keyfile:key.snk -publicsign
+ $(CSCOMPILE) -t:library dlls/test-939-2/test-939-lib.cs -r:dlls/test-939-common.dll -keyfile:key.snk -publicsign
$(ILASM) -dll dlls/test-883.il
--- /dev/null
+[assembly:System.Reflection.AssemblyVersionAttribute ("2.1.0.0")]
+
+public class Common
+{
+ public static void Foo ()
+ {
+
+ }
+}
--- /dev/null
+[assembly:System.Reflection.AssemblyVersionAttribute ("4.0.0.0")]
+
+public class A : Common
+{
+}
+
+public class B
+{
+
+}
--- /dev/null
+using System.Runtime.CompilerServices;
+
+[assembly:System.Reflection.AssemblyVersionAttribute ("2.0.0.0")]
+
+[assembly:TypeForwardedTo (typeof (Common))]
--- /dev/null
+[assembly:System.Reflection.AssemblyVersionAttribute ("1.0.0.0")]
+
+public class Common
+{
+ public static void Foo ()
+ {
+
+ }
+}
--- /dev/null
+// Compiler options: -r:dlls/test-939-1/test-939-ref.dll -r:dlls/test-939-2/test-939-lib.dll -r:dlls/test-939-common.dll
+
+class X
+{
+ public static void Main ()
+ {
+ }
+
+ static void RealTest ()
+ {
+ A.Foo ();
+ new B ();
+ }
+}
\ No newline at end of file
</method>
</type>
</test>
+ <test name="test-939.cs">
+ <type name="X">
+ <method name="Void Main()" attrs="150">
+ <size>2</size>
+ </method>
+ <method name="Void RealTest()" attrs="145">
+ <size>13</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ </test>
<test name="test-94.cs">
<type name="Base">
<method name="Int32 IVehicle.Start()" attrs="481">