问题描述
在使用有限的 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");
}
}
}
是否有人碰巧知道我哪里出错了,也许(这是厚颜无耻的请求......)为我提供一个工作代码块,并解释我哪里出错了,以及你的代码是做什么的工作。
---更新---
感谢@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);
}
}
}
解决方法
如果您使用 .NET 4 或更高版本,您可以将 PhotoshopInst
声明为 dynamic
:
dynamic PhotoshopInst = Activator.CreateInstance(PhotoshopType);
然后你就可以调用你知道底层类型支持的方法,而编译器不会抱怨。
PhotoshopInst.Open(fl);