在Azure上使用Codedom / CSharpCodeProvider进行动态编译

戈登姆

我正在使用以下代码来动态编译一些代码,并将生成的DLL存储在Azure存储中。

当我在本地运行时,一切正常,但是在使用Azure部署的版本时,则无法正常工作。

我现在已经尝试了很多东西。

这是我正在使用的最新版本。这不会引发任何错误,但是不会存储DLL(存储方法在其他很多地方都可以正常使用)。我认为权限存在问题,或者DLL没有作为文件存储。

public Tuple<bool,string> compileAndStoreCodeAsDLL(Guid actionID, string actionName, string actionMethod, string code)
    {
        string newFileName = "AncillaryTestMethods_" + actionName + ".dll";

        try
        {

            // Compile the code
            CSharpCodeProvider codeProvider = new CSharpCodeProvider();
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateExecutable = false;
            parameters.OutputAssembly = newFileName;
            parameters.GenerateInMemory = false;
            parameters.TempFiles = new TempFileCollection(".", true);
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");

            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, code);

            MemoryStream stream = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, results.CompiledAssembly);

            // Store the code in the current firm's azure directory/ActionDLLs
            this.putFile(stream, newFileName, "ActionDLLs");

            // Return ok
            return new Tuple<bool, string>(true, null);
        }
        catch (Exception e)
        {
            // Return fail
            return new Tuple<bool, string>(true, e.Message);
        }     
    }

我从以下代码开始(在本地也可以使用):

        public Tuple<bool,string> compileAndStoreCodeAsDLL(Guid actionID, string actionName, string actionMethod, string code)
    {
        string newFileName = "AncillaryTestMethods_" + actionName + ".dll";

        try
        {

            // Compile the code
            CSharpCodeProvider codeProvider = new CSharpCodeProvider();
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateExecutable = false;
            parameters.OutputAssembly = newFileName;
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");

            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, code);

            // Store the code in the current firm's azure directory/ActionDLLs
            this.putFile(results.CompiledAssembly.GetFile(newFileName), newFileName, "ActionDLLs");

            // Return ok
            return new Tuple<bool, string>(true, null);
        }
        catch (Exception e)
        {
            // Return fail
            return new Tuple<bool, string>(true, e.Message);
        }     
    }

但是在Azure上引发了一个错误“错误生成Win32资源:拒绝访问。无法删除用于默认Win32资源的临时文件'd:windows \ system32 \ inetsrv ... tmp”-系统找不到指定的文件。

大概与Azure权限有关,因此我尝试了上面的代码。

任何人都可以提出任何建议以使此功能在Azure中正常工作吗?

戈登姆

经过大约17个小时的工作之后,我终于开始工作了。情况是如此的糟糕,以至于我什至尝试连接到FluidSharp库中的Roslyn类,但是它们都有自己的主要问题。

这里有三个核心问题:

  1. Codedom似乎忽略了它自己的TempFiles属性,因此在Azure中,它们始终被写入不可访问的inetsrv目录。
  2. Codedom's "GenerateInMemory" either doesn't work or its name is utterly misleading.
  3. I needed to start my WebRole with elevated permissions (not 100% sure on this one, but haven't yet removed the code)

The solutions were:

  1. Create some Local Storage space on the Azure instance.
  2. Write the DLL to the Local Storage.
  3. Catch any errors associated to deleting .TMP files and ignore them. I found that these errors meant that CompiledAssembly had no data in it, but the DLL was still written out to Local Storage.
  4. Don't bother with GenerateInMemory
  5. Elevate the permissions

Hope this saves someone else a load of hassle!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用$ routeProvider进行动态路由和编译角度代码

来自分类Dev

使用CodeDom进行编译

来自分类Dev

使用CodeDom进行编译

来自分类Dev

是否可以使用C#编译器添加PostSharp进行动态编译

来自分类Dev

使用.net core 3.0进行动态编译和运行代码以进行脚本编写

来自分类Dev

使用CSharpCodeProvider进行C#运行时编译

来自分类Dev

使用.htaccess进行动态URL重写

来自分类Dev

使用Linq进行动态过滤

来自分类Dev

使用NGINX进行动态路由

来自分类Dev

使用$ parse进行动态数组推送

来自分类Dev

如何使用Circe进行动态解码?

来自分类Dev

使用Vuetify进行动态计算

来自分类Dev

使用NodeJS进行动态对象遍历

来自分类Dev

使用Linq进行动态过滤

来自分类Dev

使用.htaccess进行动态URL重写

来自分类Dev

使用Maven进行动态Web项目

来自分类Dev

使用NGINX进行动态路由

来自分类Dev

使用Visual Studio进行动态调试

来自分类Dev

使用 char 进行动态分配

来自分类Dev

使用宏进行动态版本选择

来自分类Dev

在数据帧上使用 groupby 进行动态移位

来自分类Dev

在on()内使用'id name结尾于'进行动态绑定

来自分类Dev

如何使用Three.js进行动态CSG操作

来自分类Dev

使用绑定变量进行动态SQL更新

来自分类Dev

使用数据库进行动态下拉菜单

来自分类Dev

如何使用pg_shard进行动态缩放

来自分类Dev

使用Jinja2进行动态CSS导入

来自分类Dev

使用Firebase和Dart进行动态搜索

来自分类Dev

Ember.Js使用TransitionTo路由进行动态分段