在反射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代码。

在反射Microsoft.TeamFoundation.VersionControl.Controls程序集时找不到Di

事实证明,由于我试图访问一个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();