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的源代码了,同时因为是预编译的,所以每个页面打开速度都挺 ...
随机推荐
- vue中非父子组件的传值bus的使用
非父子之间的组件传值,可以使用vuex.简单的状态管理,也可以用vue bus vue bus可以实现不同组件间.不同页面间的通信,比如我在A页面出发点击事件,要B页面发生变化,使用方法如下: 全局定 ...
- 利用浏览器做好数字进制和ASCII码及Unicode教与学
浏览器是现在个人计算机的标配,一般来说一个PC至少安装一种以上的浏览器.主流网页浏览器有Google Chrome.Internet Explorer.Microsoft Edge.Mozilla F ...
- C++ STL 之 内建函数对象
STL 内建了一些函数对象.分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数.这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能.使用内建函数对象 ...
- 使用JS和PHP导出table表格
把table表格的内容导出成excel 或者word等格式(简单容易不需要太多php) 导出需注意 1. 样式都在行间,导出excel表格会继承样式包括colspan.rowspan,非表格元素,样式 ...
- 第三章、前端之JavaScript
目录 第三章.前端之JavaScript 一.javaScript的引入方式 二.JavaScript语言的规范 三.语言基础 变量声明 四.数据类型 五.流程控制 六.函数 函数的argument ...
- linux下安装db2
最近研究了一下在 ubuntu下安装db2的过程,很快就完成安装,特贴出来供大家讨论,如有错误请多多指教. 注意:安装过程请使用root用户,否则会出现安装失败的情况: 安装过程: 准备工作: 准备安 ...
- CentOS 7 系统初始化
0.安装系统基础依赖工具包 yum install net-tools gcc-c++ wget lrzsz vim ntpdate cronolog make psmisc 1.修改主机名 cent ...
- jquery.table2excel,将HTML的table标签数据导出成excel
<!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...
- redis主从+哨兵 安装配置一
一.目的 实现redis的高可用. 二.同步过程 注意:当Master在后台把数据保存到快照文件完成之后,Master会把这个快照文件传送给Slave,而Slave则把内存清空后,加载该文件到内存中: ...
- PHP函数相关知识点
回调函数 <?php function myfunc($funcname,$name) { $name = "喜欢".$name; $funcname($name); } f ...