在反射Microsoft.TeamFoundation.VersionControl.Controls程序集时找不到Di
本文关键字:程序集 找不到 Di Controls VersionControl 反射 Microsoft TeamFoundation | 更新日期: 2023-09-27 18:29:19
我正试图利用Microsoft.TeamFoundation.VersionControl.Controls程序集中的现有对话框,该对话框将显示发送的TFS工作项的详细信息。我正在利用反射来实现这一点,其方式与访问此处使用的DialogChangesetDetails方法类似。
但是,在创建程序集、数组对象以存储方法参数后,无法使用.CreateInstance方法找到DialogChangesetDetails方法:
var assembly = Assembly.GetAssembly(typeof (WorkItemPolicy));
var args = new object[] {this, workItem, false};
using (
var dialog =
(Form)
assembly.CreateInstance(
"Microsoft.TeamFoundation.VersionControl.Controls.DialogWorkItemDetails", false,
BindingFlags.CreateInstance | BindingFlags.NonPublic | BindingFlags.Instance, null, args,
CultureInfo.CurrentCulture, null))
{
if (dialog == null) return;
dialog.StartPosition = FormStartPosition.CenterParent;
dialog.ShowDialog();
}
为了确保我没有试图以错误的方式到达该方法,我使用了一个反射器来接收有关它的信息:
public DialogWorkItemDetails(System.Windows.Forms.IWin32Window parent, WorkItem workItem, bool allowModification)
{
this.m_workItem = workItem;
this.m_allowModification = allowModification;
this.m_workItemStartedOutModified = this.m_workItem.IsDirty;
this.InitializeWindow();
this.UpdateButtons();
this.GetWorkItemDetails();
new WpfDialogAssistant(this)
{
HelpTopic = "vs.tfc.sourcecontrol.DialogWorkItemDetails"
}.SetOwner(parent.Handle);
}
据我所见,我正在向方法发送正确的参数,包括表单父项、工作项以及用户是否可以修改工作项。
您可以在此处找到反映的整个DialogWorkItemDetails代码。
事实证明,由于我试图访问一个Public方法,我不应该使用BindingFlag.NonPublic。我更新了它,并且不得不更改我的强制转换,因为Dialog不是一次性表单。
var assembly = Assembly.GetAssembly(typeof (WorkItemPolicy));
var args = new object[] {this, workItem, true};
var dialog =
(Window)
assembly.CreateInstance(
"Microsoft.TeamFoundation.VersionControl.Controls.DialogWorkItemDetails", false,
BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.Instance, null, args,
CultureInfo.CurrentCulture, null);
if (dialog == null) return;
dialog.ShowDialog();