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; }
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)); }