internal CompilerGlobals(VsaEngine engine, String assemName, String assemblyFileName, PEFileKinds PEFileKind, bool save, bool run, bool debugOn, bool isCLSCompliant, Version version, Globals globals) {
String moduleFileName = null;
String directory = null; //Default has assembly stored in current directory
if (assemblyFileName != null){
//The directory is an absolute path where the assembly is written
try{
directory = Path.GetDirectoryName(Path.GetFullPath(assemblyFileName));
}catch(Exception e){
throw new VsaException(VsaError.AssemblyNameInvalid, assemblyFileName, e);
}catch{
throw new JScriptException(JSError.NonClsException);
}
//For a single file assembly module filename is set to assembly filename
moduleFileName = Path.GetFileName(assemblyFileName);
//If simple name is not specified, get it by extracting the basename from assembly name
if (null == assemName || String.Empty == assemName){
assemName = Path.GetFileName(assemblyFileName);
if (Path.HasExtension(assemName))
assemName = assemName.Substring(0, assemName.Length - Path.GetExtension(assemName).Length);
}
}
//Setup default simple assembly name and module name for the case where no assemblyFileName is specified.
if (assemName == null || assemName == String.Empty)
assemName = "JScriptAssembly";
if (moduleFileName == null) {
if (PEFileKind == PEFileKinds.Dll)
moduleFileName = "JScriptModule.dll";
else
moduleFileName = "JScriptModule.exe";
}
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = assemblyFileName;
if (globals.assemblyCulture != null) assemblyName.CultureInfo = globals.assemblyCulture;
assemblyName.Flags = AssemblyNameFlags.None;
if ((globals.assemblyFlags & AssemblyFlags.PublicKey) != 0) assemblyName.Flags = AssemblyNameFlags.PublicKey;
switch ((AssemblyFlags)(globals.assemblyFlags & AssemblyFlags.CompatibilityMask)){
case AssemblyFlags.NonSideBySideAppDomain:
assemblyName.VersionCompatibility = AssemblyVersionCompatibility.SameDomain; break;
case AssemblyFlags.NonSideBySideMachine:
assemblyName.VersionCompatibility = AssemblyVersionCompatibility.SameMachine; break;
case AssemblyFlags.NonSideBySideProcess:
assemblyName.VersionCompatibility = AssemblyVersionCompatibility.SameProcess; break;
default:
assemblyName.VersionCompatibility = (AssemblyVersionCompatibility)0; break;
}
assemblyName.HashAlgorithm = globals.assemblyHashAlgorithm;
if (globals.assemblyKeyFileName != null){
try
{
using (FileStream fs = new FileStream(globals.assemblyKeyFileName, FileMode.Open, FileAccess.Read))
{
StrongNameKeyPair keyPair = new StrongNameKeyPair(fs);
if (globals.assemblyDelaySign)
if (fs.Length == 160)
{
Byte[] pkey = new Byte[160];
fs.Seek(0, SeekOrigin.Begin);
int len = fs.Read(pkey, 0, 160);
assemblyName.SetPublicKey(pkey);
}
else
assemblyName.SetPublicKey(keyPair.PublicKey);
else {
// Fetch to force reflection to try and process the key file data and throw an exception
byte[] publicKey = keyPair.PublicKey;
assemblyName.KeyPair = keyPair;
}
}
}
catch
{
globals.assemblyKeyFileNameContext.HandleError(JSError.InvalidAssemblyKeyFile, globals.assemblyKeyFileName);
}
}else if (globals.assemblyKeyName != null){
try{
StrongNameKeyPair keyPair = new StrongNameKeyPair(globals.assemblyKeyName);
byte[] publicKey = keyPair.PublicKey; // Force validation
assemblyName.KeyPair = keyPair;
}catch{
globals.assemblyKeyNameContext.HandleError(JSError.InvalidAssemblyKeyFile, globals.assemblyKeyName);
}
}
assemblyName.Name = assemName;
if (version != null) assemblyName.Version = version;
else if (globals.assemblyVersion != null) assemblyName.Version = globals.assemblyVersion;
AssemblyBuilderAccess access = save ? (run ? AssemblyBuilderAccess.RunAndSave : AssemblyBuilderAccess.Save) : AssemblyBuilderAccess.Run;
if (engine.ReferenceLoaderAPI == LoaderAPI.ReflectionOnlyLoadFrom)
access = AssemblyBuilderAccess.ReflectionOnly;
// Supply the evidence to assemblies built for VSA
if (globals.engine.genStartupClass)
this.assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, access, directory, globals.engine.Evidence);
else
this.assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, access, directory);
if (save)
this.module = this.assemblyBuilder.DefineDynamicModule("JScript Module", moduleFileName, debugOn);
else
this.module = this.assemblyBuilder.DefineDynamicModule("JScript Module", debugOn);
if (isCLSCompliant)
this.module.SetCustomAttribute(new CustomAttributeBuilder(CompilerGlobals.clsCompliantAttributeCtor, new Object[]{isCLSCompliant}));
if (debugOn){
ConstructorInfo debuggableAttr = Typeob.DebuggableAttribute.GetConstructor(new Type[] {Typeob.Boolean, Typeob.Boolean});
assemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(debuggableAttr,
new Object[] {(globals.assemblyFlags & AssemblyFlags.EnableJITcompileTracking) != 0,
(globals.assemblyFlags & AssemblyFlags.DisableJITcompileOptimizer) != 0}));
}
this.compilationEvidence = globals.engine.Evidence;
this.classwriter = null;
}