我有一个混合解决方案(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;
}
1条答案
按热度按时间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。