如何将DLL文件依赖关系复制到Azure函数应用程序的临时汇编文件夹



我正在使用使用第三方DLL的Azure函数应用程序,该应用程序对相对于当前执行的XML映射文件具有依赖性。当我在Azure堆栈上发布并运行我的功能时,我遇到了DLL无法加载XML文件的例外。我的bin目录中有XML的带有DLL,但是Azure似乎正在将编译后的DLL移至无需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正在运行的临时文件夹中?另外,我可以强迫它从垃圾箱而不是温度奔跑吗?

更新:不幸的是,我不允许在DLL上共享任何信息。我可以说的是,所有内容都发布到我的wwwroot文件夹中,但是在输出一些调试信息时,我可以看到执行正在从"临时ASP.NET文件"文件夹中进行。每个DLL都复制到其自己的单独文件夹中。d: local 临时asp.net文件 root root da2a6178 25f43073 gasedbly dl3 dl3 28A13679 d3614284_4078d301 dl3。

虽然这不是问题的真实答案,但对于此问题的解决方法是在DLL功能运行之前具有代码功能temp asp.net文件夹,然后将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");
                    }
                }
            }
        }
    }
}

谢谢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"));
                            }
                        }
                    }
                }
            }
        }
    }

最新更新