⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 assemblygenerator.cs

📁 语音视频功能 里面实现了基本的QQ与语音对话
💻 CS
字号:
using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Reflection;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using Microsoft.VisualBasic;

namespace DotNetScriptEngine
{
	/// <summary>
	/// This class will take the code and user preferences and dynamically
	/// generate an assembly.  This assembly will be called via reflection
	/// in order to run the script
	/// </summary>
	internal class AssemblyGenerator
	{
		internal Script script;

		internal AssemblyGenerator(string sourceCode)
		{
			script = new Script(sourceCode);
		}

		/// <summary>
		/// The actual workhorse of the script engine.  This function will
		/// create the assembly in memmory and return it to be used
		/// </summary>		
		internal Assembly CreateAssembly()
		{
			if (script.SourceCode.Length == 0)
			{
				DotNetScriptEngine.LogAllErrMsgs("Error:  There was no CS script code to compile\r\n");
				return null;
			}

			//Get the default language object
			DotNetLanguage language = script.Language;

			//Create an instance whichever code provider that is needed
			CodeDomProvider codeProvider = null;
			if (language.languageName == "C#")
				codeProvider = new CSharpCodeProvider();
			else if (language.languageName == "VB")
				codeProvider = new VBCodeProvider();
			else
			{
				//Neither C# or VB is used in the script.  Use reflection to create the language
				//specific code provider object.  This works because all code providers inherit
				//from CodeDomProvider
				codeProvider = LateBindCodeProvider(language);

				//If a code provider cant be created, then throw and exception
				if (codeProvider == null)
					throw new Exception("Could not create Code Provider from " + language.codeProviderName + " from assembly " + language.codeProviderName);
			}

			//create the language specific code compiler
			ICodeCompiler compiler = codeProvider.CreateCompiler();

			//add compiler parameters
			CompilerParameters compilerParams = new CompilerParameters();
			compilerParams.CompilerOptions = "/target:library /optimize";
			compilerParams.GenerateExecutable = false;
			compilerParams.GenerateInMemory = true;			
			compilerParams.IncludeDebugInformation = false;
			compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
			compilerParams.ReferencedAssemblies.Add("System.dll");			

			//add any aditional references needed
			foreach (string dotNetAssembly in script.References)
				compilerParams.ReferencedAssemblies.Add(dotNetAssembly);
						
			//actually compile the code
			CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams, script.SourceCode);

			//Do we have any compiler errors
			if (results.Errors.Count > 0)
			{
				foreach (CompilerError error in results.Errors)
					DotNetScriptEngine.LogAllErrMsgs("Compine Error:  " + error.ErrorText + "\r\n\r\n");

				return null;
			}

			//get a hold of the actual assembly that was generated
			Assembly generatedAssembly = results.CompiledAssembly;

			//return the assembly
			return generatedAssembly;
		}

		/// <summary>
		/// For languages other than VB or C# we have to use reflection to create
		/// an instance of the language specific code provider object
		/// </summary>		
		private CodeDomProvider LateBindCodeProvider(DotNetLanguage language)
		{
			//late load the assembly file that has the desired code provider
			Assembly langAssembly = Assembly.LoadFrom(language.assembly);	
		
			//Create an instance of the code provider
			return (CodeDomProvider)langAssembly.CreateInstance(language.codeProviderName);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -