Skip to content

ProxyUtil.AreInternalsVisibleToDynamicProxy does not take into account target assembly's strong-name status #488

@stakx

Description

@stakx

@GeeWee posted a bug report at devlooped/moq#991 which basically boils down to this:

using Azure.Storage.Blobs.Specialized;  // from NuGet package 'Azure.Storage.Blobs'

using Castle.DynamicProxy;

public class Bork : BlockBlobClient { }

class Program
{
    static void Main()
    {
        var generator = new ProxyGenerator();
        _ = generator.CreateClassProxy<BlockBlobClient>();  // works
        _ = generator.CreateClassProxy<Bork>();  // fails
    }
}

Proxying BlockBlobClient appears to work fine; proxying an empty subclass of it throws the following exception:

System.TypeLoadException: Method 'UploadInternal' on type 'Castle.Proxies.BorkProxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is overriding a method that is not visible from that assembly.
   at System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type)
   at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
   at System.Reflection.Emit.TypeBuilder.CreateTypeInfo()
   at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CreateType(TypeBuilder type)
   at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType()
   at Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(String name, Type[] interfaces, INamingScope namingScope)
   at Castle.Core.Internal.SynchronizedDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Castle.DynamicProxy.Generators.BaseProxyGenerator.ObtainProxyType(CacheKey cacheKey, Func`3 factory)
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors)
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy[TClass](IInterceptor[] interceptors)
   at Program.Main()

(It may or may not be relevant that PEVerify reports a bunch of invalid signatures in the netstandard2.0 DLL for that package:

[MD]: Error: Token 0x020000da following ELEMENT_TYPE_CLASS (_VALUETYPE) in signature is a ValueType (Class,respectively). [token:0x04000064]
[MD]: Error: Token 0x0200002c following ELEMENT_TYPE_CLASS (_VALUETYPE) in signature is a ValueType (Class,respectively). [token:0x0400006A]
[MD]: Error: Token 0x0200002c following ELEMENT_TYPE_CLASS (_VALUETYPE) in signature is a ValueType (Class,respectively). [token:0x0400006B]
... (a lot more of the same)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions