TLDR:我正在尝试从.Net COM dll调用异步回调到Delphi客户端.exe,但这些似乎在免注册COM中无法正常工作,而同步回调确实有效,并且异步回调正在工作时不是一个免注册的COM.
我的全球案例是,我有一个外国的闭源.Net dll暴露了一些公共事件.我需要将这些事件传递给Delphi应用程序.所以我决定制作一个中间的.dll,它可以作为我的app和另一个dll之间的COM桥.当我的dll通过regasm注册时,它运行得很好,但是当我切换到免注册COM时情况变得更糟.我将我的情况缩短为可重复的小例子,它不依赖于其他dll,所以我将在下面发布它.
基于这个答案我创建了一个公共接口ICallbackHandler,我希望从Delphi客户端应用程序获得:
namespace ComDllNet
{
[ComVisible(true)]
[Guid("B6597243-2CC4-475B-BF78-427BEFE77346")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICallbackHandler
{
void Callback(int value);
}
[ComVisible(true)]
[Guid("E218BA19-C11A-4303-9788-5A124EAAB750")]
public interface IComServer
{
void SetHandler(ICallbackHandler handler);
void SyncCall();
void AsyncCall();
}
[ComVisible(true)]
[Guid("F25C66E7-E9EF-4214-90A6-3653304606D2")]
[ClassInterface(ClassInterfaceType.None)]
public sealed class ComServer : IComServer
{
private ICallbackHandler handler;
public void SetHandler(ICallbackHandler handler) { this.handler = handler; }
private int GetThreadInfo()
{
return Thread.CurrentThread.ManagedThreadId;
}
public void SyncCall()
{
this.handler.Callback(GetThreadInfo());
}
public void AsyncCall()
{
this.handler.Callback(GetThreadInfo());
Task.Run(() …Run Code Online (Sandbox Code Playgroud) 我正在为音素对齐做一个序列到序列的模型.特别是我的火车数据看起来像配对序列(音素 - 长度),其中音素是单热矢量,长度是浮点数.所以我想用一个音素序列为模型提供信息并获得相应的长度序列.
我的网络通常是这样构建的:
model = Sequential(
EmbeddingLayer{embeddingSize} :
RecurrentLSTMLayerStack {lstmDims} :
LinearLayer{1}
)
Run Code Online (Sandbox Code Playgroud)
如果我LinearLayer{1}做对了,应该从lstmDims1 转换为1.因此,当我用长度为N的序列提供模型时,我应该得到一个长度为N的结果序列.
现在我想建立一个适当的损失函数,我认为应该是已知结果序列的元素和模型输出之间的平均差异.应该通过时间轴进行平均,以便可以管理不同长度的序列.
我打算做点什么
objectives = Input(1) #actually a sequence here as stated in the reader
result = model(features)
errs = Abs(objectives - result)
loss_function = ReduceMean(errs)
criterionNodes = (loss_function)
Run Code Online (Sandbox Code Playgroud)
但在减少运营中,它明确指出
这些操作不支持减少序列.相反,您可以通过重复实现此目的.
我不确定如何使用复发来完成我的任务.我也不确定整个概念是否合适.