这是一个非常简单的.net < - >使用事件的COM互操作示例.
只要我在.net库的Visual Studio构建选项中使用regasm或com for interopop选项的注册表,这个例子就可以正常工作.但我需要使用免费注册互操作并行清单进行部署.
应用程序在并排模式下运行良好,只是事件似乎消失了.我怀疑它是一些线程编组问题,但我似乎无法找到正确的解决方案.
这当然是尝试通过稍微复杂的互操作集成来复制我遇到的问题.与现实问题相比,我在这里遇到的问题有一个区别:
这两种解决方案都无法在免注册部署的情况下正确接收.net代码中引发的事件,并且当.net dll在注册表中注册时,这两种解决方案都按预期工作.但是:在"真实"项目中,当从System.Reflection.Target失败时,我收到运行时错误.在这个简化的例子中,它只是默默地失败.
我完全坚持这个,所以任何和所有的建议和解决方案将非常受欢迎.
我已经把完整的代码放在github上如果有人需要在回答之前玩它:https://github.com/Vidarls/InteropEventTest
.net部分
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace InteropEventTest
{
[Guid("E1BC643E-0CCF-4A91-8499-71BC48CAC01D")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
public interface ITheEvents
{
void OnHappened(string theMessage);
}
[Guid("77F1EEBA-A952-4995-9384-7228F6182C32")]
[ComVisible(true)]
public interface IInteropConnection
{
void DoEvent(string theMessage);
}
[Guid("2EE25BBD-1849-4CA8-8369-D65BF47886A5")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(ITheEvents))]
[ComVisible(true)]
public class InteropConnection : IInteropConnection
{
[ComVisible(false)]
public delegate void Happened(string theMessage);
public event Happened OnHappened;
public void DoEvent(string theMessage)
{
if (OnHappened != null)
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用JSON检索一些文本数据,这些数据包括使用换行符格式化的文本.我非常想将这些换行符渲染给用户.
问题:实现这一目标的"正确"/"推荐"方法是什么?
我试过的选项:
<p>${myText}</p>::不呈现换行符<pre>:: <p><pre>${myText}></pre></p>渲染换行符,但包含长<pre>文本的所有已知和喜爱的问题,例如某些浏览器中的水平滚动和次优字断.<br>标记替换换行符:<p>${myText | textFormat}</p>export class TextFormatValueConverter {
toView(value) {
return value.replace(new RegExp('\r?\n','g'), '<br>');
}
}
Run Code Online (Sandbox Code Playgroud)
这会渲染<br>标签,但Aurelia活页夹会转义标签并将其显示为用户的文字文本.*使用上面的转换器绑定和innerHTML :: <p innerHTML.bind="myText | textFormat"></p>渲染确定但是我担心它可能容易受到攻击,因为文本来自遗留系统,它不对网络的使用做任何输入清理.