C#点击事件打开文件对话框,在photoshop中启动文件并运行一个动作

问题描述

在使用有限的 vb.net 知识库后,我再次发现自己在 C# 方面苦苦挣扎。

我试图按下我的应用程序上的一个按钮,该按钮将打开一个文件对话框并在 photoshop 中打开选定的文件并对它们运行一个操作。

在 VB.net 中,我所要做的就是以下...

 Private launchFiles As OpenFileDialog
Private Sub OpenInPS_btn_Click(sender As Object,e As EventArgs) Handles OpenInPS_btn.Click

    launchFiles = New OpenFileDialog
    launchFiles.Title = "Select files"
    launchFiles.CheckFileExists = True
    launchFiles.Multiselect = True
    launchFiles.RestoreDirectory = False
    Dim appRef
    appRef = CreateObject("Photoshop.Application")

    If launchFiles.ShowDialog = Windows.Forms.DialogResult.OK Then
        For Each fl In launchFiles.FileNames
            appRef.Open(fl)
            appRef.DoAction("JDE Brandstore","Render to Brandstore V3")
    End If

End Sub

但是,当我尝试将其转换为 C# 时...

 private OpenFileDialog launchFiles;


    private void BTN_Photoshop_Click(object sender,EventArgs e)
    {
        launchFiles = new OpenFileDialog();
        launchFiles.Title = "Select files";
        launchFiles.CheckFileExists = true;
        launchFiles.Multiselect = true;
        launchFiles.RestoreDirectory = false;
        object appRef;
        appRef = CreateObject("Photoshop.Application");
        if (launchFiles.ShowDialog == Forms.DialogResult.OK)
        {
            foreach (var fl in launchFiles.FileNames)
            {
                appRef.Open(fl);
                appRef.DoAction("Job1","CropperSpec");
            }
        }
    }

我遇到了一大堆我目前不理解/不知道如何解决错误

enter image description here

是否有人碰巧知道我哪里出错了,也许(这是厚颜无耻的请求......)为我提供一个工作代码块,并解释我哪里出错了,以及你的代码是做什么的工作。

---更新---

感谢@Mat J 的帮助

此处的新代码版本现在可以启动 Photoshop,但我无法使用它打开任何文档。

 private OpenFileDialog launchFiles;


    private void BTN_Photoshop_Click(object sender,EventArgs e)
    {
        launchFiles = new OpenFileDialog();
        launchFiles.Title = "Select files";
        launchFiles.CheckFileExists = true;
        launchFiles.Multiselect = true;
        launchFiles.RestoreDirectory = false;

        Type PhotoshopType = Type.GetTypeFromProgID("Photoshop.Application");
        object PhotoshopInst = Activator.CreateInstance(PhotoshopType);
        PhotoshopType.InvokeMember("Visible",BindingFlags.SetProperty,null,PhotoshopInst,new object[1] { true });
        if (launchFiles.ShowDialog() == DialogResult.OK)
        {
            foreach (var fl in launchFiles.FileNames)
            {
                PhotoshopType.open(fl);
            }
        }
    }

enter image description here

非常感谢

解决方法

如果您使用 .NET 4 或更高版本,您可以将 PhotoshopInst 声明为 dynamic

dynamic PhotoshopInst = Activator.CreateInstance(PhotoshopType);

然后你就可以调用你知道底层类型支持的方法,而编译器不会抱怨。

PhotoshopInst.Open(fl);