Beispiel #1
0
 public TInterface ActivateInterface <TInterface>(string dll, IEntrypointMangler entrypointMangler = null) where TInterface : class
 {
     if (entrypointMangler == null)
     {
         entrypointMangler = DefaultEntrypointMangler;
     }
     return(ActivateInterface_ <TInterface>(dll, entrypointMangler));
 }
        public MethodInfoDetails(string dll, Type interfaceType, IEntrypointMangler entrypointMangler)
        {
            Dll = dll;

            // the real [DllImport] attribute, not our's
            AddReference(typeof(System.Runtime.InteropServices.DllImportAttribute));
            AddReference(interfaceType);

            EntrypointMangler = entrypointMangler;
        }
Beispiel #3
0
        TInterface ActivateInterface_ <TInterface>(string dll, IEntrypointMangler entrypointMangler) where TInterface : class
        {
            var interfaceType = typeof(TInterface);

            var methods           = GetInterfaceMethods(interfaceType);
            var methodInfoDetails = new MethodInfoDetails(dll, interfaceType, entrypointMangler);

            // https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/APISamples/FAQ.cs
            var nativeMethods           = new StringBuilder();
            var interfaceImplementation = new StringBuilder();

            foreach (var method in methods)
            {
                nativeMethods.AppendLine(methodInfoDetails.GetDllImportSignature(method));
                interfaceImplementation.AppendLine(methodInfoDetails.GetInterfaceSignature(method));
            }

            var(syntax, implementationTypeName) = MakeSyntax(interfaceType, nativeMethods.ToString(), interfaceImplementation.ToString());
            var syntaxTree = SyntaxFactory.ParseSyntaxTree(syntax);

            var references = methodInfoDetails.References;

            return(EmitCSharpCompilation <TInterface>(syntaxTree, references, implementationTypeName));
        }