HearthBuddy CSharpCodeProvider 如何编译cs文件
源码
源码1
namespace Hearthbuddy.Windows
{
// Token: 0x02000041 RID: 65
public class MainWindow : Window, IComponentConnector
// Hearthbuddy.Windows.MainWindow
// Token: 0x0600021B RID: 539 RVA: 0x0008A250 File Offset: 0x00088450
private static void smethod_1(string string_0, string string_1, IEnumerable<string> ienumerable_0)
{
try
{
using (CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider())
{
CompilerParameters compilerParameters = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = true
};
foreach (string value in ienumerable_0)
{
compilerParameters.ReferencedAssemblies.Add(value);
}
CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromSource(compilerParameters, new string[]
{
string_1
});
if (compilerResults.Errors.Count > )
{
StringBuilder stringBuilder = new StringBuilder();
foreach (object obj in compilerResults.Errors)
{
CompilerError compilerError = (CompilerError)obj;
stringBuilder.AppendFormat(string.Concat(new object[]
{
"Line number ",
compilerError.Line,
", Error Number: ",
compilerError.ErrorNumber,
", '",
compilerError.ErrorText,
";"
}), Array.Empty<object>());
stringBuilder.AppendLine();
}
throw new Exception(stringBuilder.ToString());
}
Type type = compilerResults.CompiledAssembly.GetType(string_0);
object obj2 = Activator.CreateInstance(type);
object obj3 = type.GetMethod("Execute").Invoke(obj2, new object[]);
if (obj3 != null)
{
MainWindow.ilog_0.Info(obj3);
}
}
}
catch (Exception exception)
{
MainWindow.ilog_0.Error("[Ui] An exception occurred:", exception);
}
}
源码2
Hearthbuddy\Triton\Common\CodeCompiler.cs
public CompilerResults Compile()
{
this.method_2();
this.method_3();
if (this.SourceFilePaths.Count != )
{
CompilerResults result;
using (CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider(new Dictionary<string, string>
{
{
"CompilerVersion",
string.Format(CultureInfo.InvariantCulture.NumberFormat, "v{0:N1}", this.CompilerVersion)
}
}))
{
csharpCodeProvider.Supports(GeneratorSupport.Resources);
if (this.resourceWriter_0 != null)
{
this.resourceWriter_0.Close();
this.resourceWriter_0.Dispose();
this.resourceWriter_0 = null;
}
foreach (Stream stream in this.list_2)
{
try
{
stream.Close();
stream.Dispose();
}
catch
{
}
}
this.list_2.Clear();
CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromFile(this.Options, this.SourceFilePaths.ToArray());
if (!compilerResults.Errors.HasErrors)
{
this.CompiledAssembly = compilerResults.CompiledAssembly;
}
compilerResults.TempFiles.Delete();
foreach (string path in this.list_1)
{
try
{
File.Delete(path);
}
catch
{
}
}
this.list_1.Clear();
result = compilerResults;
}
return result;
}
if (this.resourceWriter_0 != null)
{
this.resourceWriter_0.Close();
this.resourceWriter_0.Dispose();
this.resourceWriter_0 = null;
}
foreach (Stream stream2 in this.list_2)
{
try
{
stream2.Close();
stream2.Dispose();
}
catch
{
}
}
this.list_2.Clear();
foreach (string path2 in this.list_1)
{
try
{
File.Delete(path2);
}
catch
{
}
}
this.list_1.Clear();
return null;
}
在CodeCompiler的构造函数中,调用了下面的方法。在编译之前,先删除CompiledAssemblies文件夹下已经编译好的文件。
// Triton.Common.CodeCompiler
// Token: 0x0600155E RID: 5470 RVA: 0x000CE98C File Offset: 0x000CCB8C
private static void smethod_1()
{
string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "CompiledAssemblies");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
foreach (string path2 in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories))
{
try
{
File.Delete(path2);
}
catch (Exception)
{
}
}
foreach (string path3 in Directory.GetDirectories(path))
{
try
{
Directory.Delete(path3);
}
catch (Exception)
{
}
}
if (!Directory.Exists(CodeCompiler.CompiledAssemblyPath))
{
Directory.CreateDirectory(CodeCompiler.CompiledAssemblyPath);
}
}
问题
如下代码无法通过编译
using System;
using System.Linq;
using System.Xml.Linq; namespace HREngine.Bots
{
public class XmlHelper
{
private static XElement _cardDatabase; public static string GetCardNameByCardId(string filePath, string cardId)
{
if (_cardDatabase == null)
{
_cardDatabase = XElement.Load(filePath);
} var tempTargetElement = _cardDatabase.Elements("Entity")
.FirstOrDefault(x => x.Attribute("CardID")?.Value == cardId);
var tempTargetElement2 = tempTargetElement?.Elements("Tag")
.FirstOrDefault(x => x.Attribute("name")?.Value == "CARDNAME");
XElement targetElement = tempTargetElement2?.Element("enUS");
if (targetElement == null)
{
throw new Exception(string.Format("Can not find card by Id {0}", cardId));
} return targetElement.Value;
}
}
}
"The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)"
The type or namespace name 'Xml' does not exist in the namespace 'System' (are you missing an assembly reference?)
The type or namespace name 'XElement' could not be found (are you missing a using directive or an assembly reference?)
2019-08-04 18:06:56,506 [7] ERROR AssemblyLoader`1 (null) - [Reload] An exception occurred.
System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\clu\Desktop\GitHub\HearthbuddyRelease\bin\roslyn\csc.exe'.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.get_CompilerName()
at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromFileBatch(CompilerParameters options, String[] fileNames)
at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.CompileAssemblyFromFileBatch(CompilerParameters options, String[] fileNames)
at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromFile(CompilerParameters options, String[] fileNames)
at Triton.Common.CodeCompiler.Compile()
at Triton.Common.AssemblyLoader`1.Reload(String reason)
Reload的逻辑
// Triton.Common.AssemblyLoader<T>
// Token: 0x06001556 RID: 5462 RVA: 0x000CE6C0 File Offset: 0x000CC8C0
public void Reload(string reason)
{
this.ilog_0.Debug(string.Format("Reloading AssemblyLoader<{0}> - {1}", typeof(T), reason));
this.Instances = new List<T>();
if (!Directory.Exists(this.string_0))
{
this.ilog_0.Error(string.Format("Could not Reload assemblies because the path \"{0}\" does not exist.", this.string_0));
return;
}
foreach (string path in Directory.GetDirectories(this.string_0))
{
try
{
CodeCompiler codeCompiler = new CodeCompiler(path);
CompilerResults compilerResults = codeCompiler.Compile();
if (compilerResults != null)
{
if (compilerResults.Errors.HasErrors)
{
foreach (object obj in compilerResults.Errors)
{
this.ilog_0.Error("Compiler Error: " + obj.ToString());
}
}
else
{
this.Instances.AddRange(new TypeLoader<T>(codeCompiler.CompiledAssembly, null));
}
}
}
catch (Exception ex)
{
if (ex is ReflectionTypeLoadException)
{
foreach (Exception exception in (ex as ReflectionTypeLoadException).LoaderExceptions)
{
this.ilog_0.Error("[Reload] An exception occurred.", exception);
}
}
else
{
this.ilog_0.Error("[Reload] An exception occurred.", ex);
}
}
}
using (List<T>.Enumerator enumerator2 = new TypeLoader<T>(null, null).GetEnumerator())
{
while (enumerator2.MoveNext())
{
AssemblyLoader<T>.Class229 @class = new AssemblyLoader<T>.Class229();
@class.gparam_0 = enumerator2.Current;
if (!this.Instances.Any(new Func<T, bool>(@class.method_0)))
{
this.Instances.Add(@class.gparam_0);
}
}
}
if (this.eventHandler_0 != null)
{
this.eventHandler_0(this, null);
}
}
string_0的赋值
// Token: 0x06001551 RID: 5457 RVA: 0x000CE580 File Offset: 0x000CC780
public AssemblyLoader(string directory, bool detectFileChanges)
{
this.Instances = new List<T>();
this.string_0 = directory;
this.bool_0 = detectFileChanges;
if (this.bool_0)
{
this.fileSystemWatcher_0.Path = directory;
this.fileSystemWatcher_0.Filter = "*.cs";
this.fileSystemWatcher_0.IncludeSubdirectories = true;
this.fileSystemWatcher_0.EnableRaisingEvents = true;
this.fileSystemWatcher_0.Changed += this.method_0;
this.fileSystemWatcher_0.Created += this.method_1;
this.fileSystemWatcher_0.Deleted += this.method_2;
}
this.Reload("Initializing");
}
method2在读取文件路径
// Triton.Common.CodeCompiler
// Token: 0x06001573 RID: 5491 RVA: 0x000CF470 File Offset: 0x000CD670
private void method_2()
{
if (this.FileStructure == CodeCompiler.FileStructureType.Folder)
{
foreach (string string_ in Directory.GetFiles(this.SourcePath, "*.resx", SearchOption.AllDirectories))
{
this.method_1(string_);
}
bool flag = false;
foreach (string string_2 in Directory.GetFiles(this.SourcePath, "*.baml", SearchOption.AllDirectories))
{
flag = true;
this.method_0(string_2);
}
foreach (string text in Directory.GetFiles(this.SourcePath, "*.cs", SearchOption.AllDirectories))
{
if (text.ToLowerInvariant().Contains(".g.cs"))
{
if (flag)
{
this.SourceFilePaths.Add(text);
}
}
else if (text.ToLowerInvariant().Contains(".xaml.cs"))
{
if (flag)
{
this.SourceFilePaths.Add(text);
}
}
else
{
this.SourceFilePaths.Add(text);
}
}
return;
}
this.SourceFilePaths.Add(this.SourcePath);
}
HearthBuddy CSharpCodeProvider 如何编译cs文件的更多相关文章
- 用csc命令行手动编译cs文件
一般初学c#时,用记事本写代码,然后用命令行执行csc命令行可以编译cs文件.方法有两种 1:配置环境,一劳永逸 一般来说在C:\Windows\Microsoft.NET\Framework\v4. ...
- C# 使用命令行编译单个CS文件
编译单个CS文件. 1.编译 File.cs 以产生 File.exe: csc File.cs 2.编译 File.cs 以产生 File.dll: ...
- 九、将cs文件快速的转换成可执行文件和响应文件(配置编译开关的文件)
1.将包含多个类型的源代码文件转换为可以部署的文件.有如下Program.cs的文件,代码如下: public sealed class Program { public static void Ma ...
- C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...
- VS.NET2013发布网站的时候去掉.cs文件(预编译)(转)
在要发布的网站上右键,选择"发布网站". 在发布窗口中,会让你选择一个发布配置文件,没有的话点击下拉菜单在里面选择新建一个. NEXT. 好,现在发布一下网站.发布出来 ...
- C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件
比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...
- 如何把.cs文件编译成DLL文件
开始--程序--Microsoft Visual Studio.NET 2013--Visual Studio.NET工具,点击其中的"VS2013 开发人员命令提示",就会进入M ...
- C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用
1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图 ...
- 安利一个MVC的好东西,RazorGenerator.MsBuild,可以自动编译cshtml文件
在传统的asp.net webForm 开发里,在发布时,如果选择预编译,就会自动将所有的aspx 文件编译,在发布后的目录里,就看不到aspx的源代码了,同时因为是预编译的,所以每个页面打开速度都挺 ...
随机推荐
- js之数据类型(对象类型——单体内置对象——JSON)
JSON(Java Script Object Notation)使用JavaScript语法,是用于存储和传输数据的格式,通常用于服务端向网页传递数据.JSON格式仅仅是一个文本,文本可以被任何编程 ...
- C++ STL 之 deque
deque 和 vector 的最大差异? 一在于 deque 允许常数时间内对头端进行元素插入和删除操作. 二在于 deque 没有容量的概念,因为它是动态的以分段的连续空间组合而成,随时可以增加一 ...
- Linux软链接创建及删除
1.创建软链接 具体用法是:ln -s [源文件] [软链接文件]. [root@localhost folder]# pwd /tmp/folder [root@localhost fol ...
- 【Java并发】锁机制
一.重入锁 二.读写锁 三.悲观锁.乐观锁 3.1 悲观锁 3.2 乐观锁 3.3 CAS操作方式 3.4 CAS算法理解 3.5 CAS(乐观锁算法) 3.6 CAS缺点 四.原子类 4.1 概述 ...
- 【SpringBoot】自动配置
一.取值 1.1 @Value 1.2 ConfigurationProperties 二.导入配置文件 2.1 @PropertySource 三.配置文件的加载 3.1 默认的加载顺序 3.2 外 ...
- Django项目上线的准备工作
settings文件配置 添加上STATIC_ROOT = os.path.join(BASE_DIR, "/static/") 我的配置项目文件的最终 STATIC_URL = ...
- web开发:jquery之DOM
一.文档结构 二.文档操作 三.文档操作案例 四.form表单 五.正则 六.form案例 一.文档结构 ```jsvar $sup = $('.sup');console.log($sup.chil ...
- java--mybatis的实现原理
动态代理? 需要调试下,看下源码,再研究下……
- 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?(未完成)
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?(未完成)
- Java实验1 - 类的继承(super)- 创建checkaccount继承account
笔记总结: /** 任务81: 继承性,(降低代码亢余度) * 1.class 子类A Extends 父类B,(private 的内容无法被继承) * 2. 方法可以覆盖(Overrides), 注 ...