如何将dll文件依赖项复制到Azure Function App的Temp编译文件夹?

时间:2017-12-20 16:40:08

标签: c# xml azure dll

我正在使用一个使用第三方DLL的azure函数应用程序,该应用程序依赖于相对于当前执行的文件夹中存在的XML映射文件。当我在Azure堆栈上发布并运行我的函数时,我遇到了dll无法加载XML文件的异常。我在bin目录中使用dll存在XML,但Azure似乎将已编译的dll移动到没有所需XML的临时文件夹,并继续根据以下异常消息查找相对于该临时路径的XML :

"Could not find a part of the path 'D:\\local\\Temporary ASP.NET Files\\root\\da2a6178\\25f43073\\assembly\\dl3\\28a13679\\d3614284_4078d301\\Resources\\RepresentationSystem.xml'."

有什么方法可以确保这些附加文件也被复制到Azure运行的临时文件夹中?或者,我可以强制它从bin而不是temp运行吗?

更新:很遗憾,我不允许在dll上分享任何信息。我可以说的是,所有内容都发布到我的wwwroot文件夹,但是当输出一些调试信息时,我可以看到执行是从“Temporary ASP.NET Files”文件夹中发生的。每个dll都被复制到自己的单独文件夹中。 D:\ local \ Temporary ASP.NET Files \ root \ da2a6178 \ 25f43073 \ assembly \ dl3 \ 28a13679 \ d3614284_4078d301 \ ThirdParty.dll是那个路径是有问题的dll,它排列在它希望xml的位置

2 个答案:

答案 0 :(得分:1)

虽然这不是问题的真正答案,但这个问题的解决方法是在dll函数运行之前在代码中有一个函数,它在Temp ASP.Net文件夹中搜索有问题的dll,并且然后将xml文件从已知位置复制到该目录。

// Work Around Begin Here
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
// Check if we are in temp dir
if (assemblyFolder.Contains("Temporary ASP.NET Files"))
{
    DirectoryInfo dir = new DirectoryInfo(assemblyFolder);
    // Go up 2 dirs
    DirectoryInfo top = dir.Parent.Parent;
    DirectoryInfo[] dirs = top.GetDirectories();
    foreach (DirectoryInfo child in dirs)
    {
        DirectoryInfo[] dirs2 = child.GetDirectories();
        foreach (DirectoryInfo child2 in dirs2)
        {
            // Find out if this is the Rep
            if (File.Exists(child2.FullName + "\\ThirdParty.Representation.dll"))
            {

                // Look to see if resource folder is there
                if (!Directory.Exists(child2.FullName + "\\Resources"))
                {
                        child2.CreateSubdirectory("Resources");
                }

                DirectoryInfo resDir = new DirectoryInfo(child2.FullName + "\\Resources");

                if (File.Exists(resourceDir + "RepresentationSystem.xml"))
                {
                    if(!File.Exists(resDir.FullName + "\\RepresentationSystem.xml"))
                    {

                        File.Copy(resourceDir + "RepresentationSystem.xml", resDir.FullName + "\\RepresentationSystem.xml");
                    }
                }

                if (File.Exists(resourceDir + "UnitSystem.xml"))
                {
                    if (!File.Exists(resDir.FullName + "\\UnitSystem.xml"))
                    {

                        File.Copy(resourceDir + "UnitSystem.xml", resDir.FullName + "\\UnitSystem.xml");
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

感谢DoubleHolo的解决方法。它运行正常。 我更改了仅添加 Path.Combine 的代码以简化代码。

private void CopyResourcesToTemporaryFolder()
{
        // Work Around Begin Here
        string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

        string resourceDir = Path.Combine(FileUtils.WebProjectFolder, "Resources");

        // Check if we are in temp dir
        if (assemblyFolder.Contains("Temporary ASP.NET Files"))
        {
            DirectoryInfo dir = new DirectoryInfo(assemblyFolder);
            // Go up 2 dirs
            DirectoryInfo top = dir.Parent.Parent;
            DirectoryInfo[] dirs = top.GetDirectories();
            foreach (DirectoryInfo child in dirs)
            {
                DirectoryInfo[] dirs2 = child.GetDirectories();
                foreach (DirectoryInfo child2 in dirs2)
                {
                    // Find out if this is the Rep
                    if (File.Exists(Path.Combine(child2.FullName, "AgGateway.ADAPT.Representation.DLL")))
                    {

                        // Look to see if resource folder is there
                        if (!Directory.Exists(Path.Combine(child2.FullName, "Resources")))
                        {
                            child2.CreateSubdirectory("Resources");
                        }

                        DirectoryInfo resDir = new DirectoryInfo(Path.Combine(child2.FullName, "Resources"));

                        if (File.Exists(Path.Combine(resourceDir, "RepresentationSystem.xml")))
                        {
                            if (!File.Exists(Path.Combine(resDir.FullName, "RepresentationSystem.xml")))
                            {

                                File.Copy(Path.Combine(resourceDir, "RepresentationSystem.xml"), Path.Combine(resDir.FullName, "RepresentationSystem.xml"));
                            }
                        }

                        if (File.Exists(Path.Combine(resourceDir, "UnitSystem.xml")))
                        {
                            if (!File.Exists(Path.Combine(resDir.FullName, "UnitSystem.xml")))
                            {

                                File.Copy(Path.Combine(resourceDir, "UnitSystem.xml"), Path.Combine(resDir.FullName, "UnitSystem.xml"));
                            }
                        }

                    }
                }
            }
        }

    }