小编Wiz*_*bit的帖子

您如何在服务之间共享gRPC原型定义

我指定了许多独立的gRPC服务,这些服务都将在同一服务器进程中托管.每个服务都在自己的protobuf文件中定义.然后通过gRPC工具运行这些工具,为我提供目标语言(在我的情况下为c#),然后我可以在其中实现我的服务器和客户端.

每个这些不同的API使用一些共同的元素,诸如错误响应枚举,该消息类型(这似乎是在可用GRPC WellKnownTypes ;但我不能看我怎么有,要么让我定义我自己).

目前,我最终将每个proto构建重复的枚举和类放入他们自己的命名空间中.虽然我知道我可以在一个共同的原型文件中共享这些定义并包含它; 我不知道如何只将这些代码生成一个共同的命名空间.虽然这是有效的,但将它保持在一组是最整洁的; 如果在服务之间聚合错误等事情,它在转换和等效性方面也可能会出现问题.

我假设我遗漏了一些东西,因为我对WellKnownTypes命名空间这样的东西的阅读表明这应该是可能的,但如前所述,我也没有看到我在Proto中如何引用它.

因此目前在gRPC上似乎相当轻松,所以我的搜索量不会太多,我是新手,所以任何指针?

c# protocol-buffers protobuf-net grpc

8
推荐指数
1
解决办法
2816
查看次数

如何将加载的程序集提供给C#中的Roslyn工作区

我正在使用运行时代码生成来增强现有流程.我在运行时创建的代码需要访问创建代码的进程已经引用的一些相同的dll.

问题是该进程在某些第三方软件中运行,该软件从资源加载dll并将它们注入我的进程...因此我无法访问磁盘上的dll或外部包装器中包含dll的资源.

因此,我尝试使用我已经在内存中的程序集并将它们提供给Roslyn工作区,我将运行时代码放入其中进行编译.我想我可以尝试使用二进制格式化器来序列化程序集,如此SO: 对装配负载的相反操作(byte [] rawAssembly)

但即使我几乎按原样采用代码:

Assembly yourAssembly = typeof(object).Assembly;
var formatter = new BinaryFormatter();
var ms = new MemoryStream();
formatter.Serialize(ms, yourAssembly);
var reloadedAssembly = Assembly.Load(ms.GetBuffer());
Run Code Online (Sandbox Code Playgroud)

我明白了:

An exception of type 'System.BadImageFormatException' occurred in mscorlib.dll but was not handled in user code
Run Code Online (Sandbox Code Playgroud)

其他搜索结果似乎没有任何改善.

我想做的是:

var assemblyRef = MetadataReference.CreateFromAssembly(typeof(object).Assembly);
mySolution.AddMetadataReference(projectId, assemblyRef);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

.net c# .net-assembly roslyn roslyn-code-analysis

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

为什么 BufferBlock<T>.ReceiveAsync() 在数据可用时挂起?

我是 TPL 数据流的新手。

我正在尝试为相当快速的输入流构建一个节流异步更新。BufferBlock 似乎很适合这个想法,因为我可以调用 ReceiveAll() 来从缓冲区中获取所有内容,并且在某些情况下,我无法在 ReceiveAsync() 上等待以在它到达时拾取下一个元素。

但它似乎有时会挂在 ReceiveAsync() 调用上;并且失败的条件很奇怪。

请注意,我对为什么会挂起很感兴趣。我已经找到了另一种使我正在处理的应用程序工作的方法,但它可能不像我没有使用 TPL Dataflow 那样简洁或可扩展,因为我显然不了解它是如何工作的。

进一步说明这里的关键用法是我执行TryReceiveAll()然后等待 ReceiveAsync()如果失败。这是突发数据到达的常见模式,我想将数据作为批处理进行处理。这就是我不想只在ReceiveAsync()上循环的原因,因此为什么直接挂钩ActionBlockTransformBlock是行不通的。如果我删除TryReceiveAll()我的版本似乎按预期工作;不过,正如其他评论所指出的那样,对于不同的人来说似乎是不同的,所以这可能是巧合。

这是一个失败的示例...将其放入引用和使用System.Threading.Tasks.Dataflow.dll的控制台应用程序中:

using System.Threading;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
Run Code Online (Sandbox Code Playgroud)

失败的例子:

class Program
{
    static void Main(string[] args)
    {
        var context = new CancellationTokenSource();
        var buffer = new BufferBlock<int>(new DataflowBlockOptions { CancellationToken = context.Token });
        var task = Task.Run(() =>ProcessBuffer(buffer, context.Token), context.Token);

        // shove 10 things onto the buffer …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library tpl-dataflow

5
推荐指数
0
解决办法
1292
查看次数