小编sjk*_*jkp的帖子

当引用的程序集引用mscorlib 2.0.5.0和4.0.0.0时,如何让roslyn编译

我正在动态构建一个使用Microsoft.OData.Client的类,这个库引用了mscorlib 2.0.5.0(我猜PCL)和4.0.0.0. 在此输入图像描述

我想用roslyn编译我的类,作为一个更大的程序的一部分,但我似乎无法让它工作.我的Roslyn编译器代码非常简约

SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(s);
            string assemblyName = Path.GetRandomFileName();

            List<MetadataReference> references = new List<MetadataReference>()
            {
                MetadataReference.CreateFromFile(typeof(DataServiceActionQuery).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(ODataAction).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(GeneratedCodeAttribute).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(IEdmModel).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(TimeOfDay).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
                MetadataReference.CreateFromFile(typeof(XmlDocument).Assembly.Location),
               // MetadataReference.CreateFromFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile328\mscorlib.dll")

            };

            references.AddRange(Directory.GetFiles(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades").Select(f => MetadataReference.CreateFromFile(f)));

            var op = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
            //op.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default);
            //CSharpCompilationOptions.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default);
            CSharpCompilation compilation = CSharpCompilation.Create(
                assemblyName,
                syntaxTrees: new[] { syntaxTree },
                references: references,
                options: op);
            Assembly assembly = null;
            using (var ms = new MemoryStream())
            {
                EmitResult result = compilation.Emit(ms);

                if (!result.Success)
                {
                    IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic …
Run Code Online (Sandbox Code Playgroud)

.net c# roslyn

5
推荐指数
1
解决办法
1197
查看次数

从谷歌云存储下载总是不正确的哈希

我正在尝试从谷歌云存储中下载一些文件(来自谷歌播放发布的应用程序的日志文件).

我的代码看起来像这样

Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", "my-service-account-credential.json", EnvironmentVariableTarget.Process);
StorageClient storageClient = StorageClient.Create();

var bucketName = "mybucketname";
var buckets = storageClient.GetBucket(bucketName);
var objects = storageClient.ListObjects(bucketName).ToList();
foreach (var o in objects)
{
    try
    {
        Directory.CreateDirectory(Path.GetDirectoryName(o.Name));
        using (var fs = File.Open(o.Name, FileMode.OpenOrCreate))
        {
            await storageClient.DownloadObjectAsync(bucketName, o.Name, fs);                                               
        }
    }
    catch (Exception e)
    {
        if (e.Message.StartsWith("Incorrect hash"))
        {
            continue;
        }
        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

代码实际上似乎工作正常(通过查看实际下载的文件内容来判断,它是csv文件).但正如你所看到的,我已经实现了一个令人讨厌的尝试catch/hack,因为我下载的每个文件都抛出一个异常,说明散列是不正确的.我假设客户端库将下载内容的散列与存储桶的散列进行比较,这些不相同导致它成为异常.

例外是:

System.IO.IOException: Incorrect hash: expected 'DXpVGw==' (base64), was '2RMrcw==' (base64)
   at Google.Cloud.Storage.V1.StorageClientImpl.<DownloadObjectAsyncImpl>d__48.MoveNext()
--- End of stack trace from previous location where exception was …
Run Code Online (Sandbox Code Playgroud)

c# google-cloud-storage

3
推荐指数
1
解决办法
373
查看次数

标签 统计

c# ×2

.net ×1

google-cloud-storage ×1

roslyn ×1