public void Compile(string dllPath, bool createApi)
{
FieldsToProperties(dllPath);
var apiPath = (createApi)? Path.ChangeExtension(dllPath, "API.dll") : dllPath;
var references = AssemblyWeaver.GetReferences(dllPath);
references.Remove(Path.GetFileName(apiPath));
var apiTypes = ReferenceCollector.CollectReferences(dllPath, RpcTypes);
using (var apiGenPaths = new TemporaryAssemblyPaths())
{
var apiReferences = references.Where(s => s.EndsWith(".API.dll")).ToList();
AssemblyWeaver weaver;
if (createApi)
{
//Create assembly with required types by the generated API assembly
weaver = new AssemblyWeaver();
weaver.AddReference(dllPath, "EngineManaged");
weaver.AddReference(dllPath, "EngineBindings");
weaver.AddReference(dllPath, "System");
weaver.AddReference(dllPath, "System.Core");
foreach (var apiReference in apiReferences)
weaver.AddReference(dllPath, Path.GetFileNameWithoutExtension(apiReference));
weaver.CopyTypes(dllPath, apiTypes);
weaver.Write(apiPath);
}
//API generated assembly
var apiGenReferences = apiReferences.ToList();
apiGenReferences.Add("EngineManaged.dll");
apiGenReferences.Add(apiPath);
DotNetCompiler.CompileIntoAssembly(apiGenPaths.DllPath, apiGenReferences, apiWriter.GeneratedFiles);
//Add API generated assembly to API assembly
weaver = new AssemblyWeaver(apiPath);
weaver.CloneMembers(GenerationContext.MemberClones);
weaver.AddMemberOptions(GenerationContext.MemberOptions);
//Merge some generated files.
weaver.MergeTypes(apiGenPaths.DllPath, GenerationContext.DataObjectsMap);
//Add all the other generated types.
weaver.CopyAssembly(apiGenPaths.DllPath);
if (createApi)
{
//Add attribute InternalsVisibleToAttribute
var dllName = Path.GetFileNameWithoutExtension(dllPath);
weaver.AddAttribute(typeof(InternalsVisibleToAttribute), new []{typeof(string)}, new object[]{dllName});
}
weaver.Write(apiPath);
}
if (!createApi)
return;
var typeFowarder = new TypeFowarder(dllPath);
typeFowarder.FowardTypes(apiPath, apiTypes);
typeFowarder.Write(dllPath);
}