c# - Visual Studio 组件导入在 vsix 项目 (MEF) 中为空
问题描述
我正在编写一个 Visual Studio 扩展,我需要创建自己的IWpfTextViewHost
(CodeEditor 窗口)。这可以通过 来完成,ITextEditorFactoryService
但这必须通过 MEF 框架加载。
但我的进口总是null
,但我似乎无法弄清楚为什么我的进口是null
。我对 MEF 的工作原理有一个粗略的了解,有没有一种方法可以调用CompositionContainer
Visual Studio 本身?还是 vsix 项目构建了这个容器?如果是这样,基于什么设置?
public class MyViewHost {
[Import]
public ITextEditorFactoryService TextEditorFactory { get; set; }
public IWpfTextViewHost CreateViewHost(ITextBuffer textBuffer)
{
var textView = this.TextEditorFactory.CreateTextView(textBuffer);
return this.TextEditorFactory.CreateTextViewHost(textView, true);
}
}
编辑
这是相关部分extension.vsixmanifest
<Assets>
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="Build%CurrentProject%" Path="|dllName;PkgdefProjectOutputGroup|" />
<Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project" Path="dllName" />
</Assets>
解决方案
我根据@nejcs 响应和这个gist找到了答案。我将发布解决方案:
[Export(typeof(IMyViewHost))]
public class MyViewHost : IMyViewHost
{
[Import]
public ITextEditorFactoryService TextEditorFactory { get; set; }
public IWpfTextViewHost CreateViewHost(ITextBuffer textBuffer)
{
var textView = this.TextEditorFactory.CreateTextView(textBuffer);
return this.TextEditorFactory.CreateTextViewHost(textView, true);
}
IMyViewHost
是CreateViewHost
Method 的接口。SatisfyImportsOnce
必须在扩展命令类的构造函数中调用,并且必须IMyViewHost
在此扩展命令类中导入。
推荐阅读
- javascript - Document.getelementByID 和 Jquery 在 javascript 中获取 Dom 元素的区别是什么?
- android - 错误:找不到符号类 C 错误?安卓
- mysql - 空表上的左连接在 MySQL 中返回错误
- elixir - 为什么进程 ID 返回未定义?
- apache-spark - 在 PySPARK 中创建具有从所有其他列创建的值作为 JSON 的列
- c# - => 和 get {} 之间的区别
- r - 获取与值匹配的 data.table 列的索引
- python-3.x - 仅使用 Pymongo 获取关于(时间或 ID)的最新文档
- javascript - 带有装饰器的 JS 验证
- spring - 如何在 Spring 集成 ServiceActivator 上触发多个输出通道?