azure 创建BlobClient会导致发布配置中System.Diagnostic.DiagnosticSource版本=4.0.4.0的FileNotFoundException

64jmpszr  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(217)

我有一个混合解决方案(Native C++,C++/CLI,c#,.NET),使用最新的Visual Studio 2022。我的解决方案的目标是框架版本4.7.2。我有两个C#类库项目,每个项目都有从Azure Blob存储上传或下载文件的功能。因此,这两个项目都使用最新版本12.16.0的Azure.Storage.Blobs NuGet包。
当我在调试模式下运行程序时,一切都很正常。但是在Release config中,当其中一个函数想要创建一个用于上传/下载的BlobClient时,我会得到以下异常:
System.IO.FileNotFoundException:“未能加载文件或程序集“System.Diagnostics.DiagnosticSource,Version=4.0.4.0,Culture=neutral,PublicKeyToken= cc 7 b13 ffcd 2ddd 51”或它的某一个依赖项。系统找不到指定的文件。
根据NuGet.org,Azure.Storage.Blobs->Azure.Storage.Common 12.15.0->Azure.Core(>= 1.31.0)->System.Diagnostics.DiagnosticSource(>= 4.6.0)System.Memory(>= 4.5.5)->System.Buffers(>= 4.5.1)的依赖关系树。我已经为这两个项目安装了所有软件包的最新稳定版本,包括System. DiagnosticsSourceNuGet软件包(7.0.2)。7.0.2 System.Diagnostics.DiagnosticsSource包包含运行时版本4.0.30319。
是什么导致了这个异常,为什么它要查找System.Diagnostics.DiagnosticSource版本=4.0.4.0?
代码如下:

public bool UploadFileToAzureBlobStorage(string Path, string containerName, string BlobName)
    {
        string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
        EnvironmentVariableTarget target;
        if (userName == @"NT AUTHORITY\SYSTEM")
            target = EnvironmentVariableTarget.Machine;
        else
            target = EnvironmentVariableTarget.User;
        string connectionString = Environment.GetEnvironmentVariable("HOROSCOPE_STORAGE_ACCT_CONNECTION_STRING", target);
        //string containerName = "chart-reports";
        string blobName = BlobName;
        string filePath = Path;
    
        BlobContainerClient container = null;
        BlobClient blob = null;
        try
        {
            container = new BlobContainerClient(connectionString, containerName);
            blob = container.GetBlobClient(blobName);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return false;
        }
        // Upload local file
        try
        {
            // set content-type from https://github.com/Azure/azure-sdk-for-net/issues/9823
            blob.Upload(filePath, new BlobHttpHeaders {ContentType = "text/html"},
                conditions: null); // "conditions: null" means overwrite
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return false;
        }
        return true;
    }
3z6pesqy

3z6pesqy1#

谢了阿达利亚特结果表明,即使设置了“复制本地”,也没有将有问题的DLL(System.Diagnostic.DiagnosticSource)复制到输出文件夹。我应该马上意识到这一点,但被系统一直在寻找v4.0.4.0而不是两个项目(包括app.config,packages.config等)中引用的v7.0.0.2这一事实所迷惑。这是使用VS或MSBuild构建时的常见问题(根据许多帖子)。B和C都调用X.dll。X.dll依赖于Y.dll,但是,即使Y.dll在B和C项目中都被特别引用,构建过程为了保持整洁,也不会将Y.dll复制到输出文件夹。解决这个问题的一种方法(我的方法)是添加对项目A的引用。然后它肯定会被复制到输出文件夹。
这是一个相当常见的问题,解决方案更复杂。例如,参见c# - Dependent DLL is not getting copied to the build output folder in Visual Studio - Stack Overflow

相关问题