Ausgabe
Wieder kämpfe ich mit C#, nachdem ich von einer begrenzten vb.net-Wissensbasis komme.
Ich versuche, eine Schaltfläche in meiner Anwendung zu drücken, die einen Dateidialog öffnet und die ausgewählten Dateien in Photoshop öffnet und eine Aktion für sie ausführt.
In VB.net musste ich nur Folgendes tun …
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
Wenn ich jedoch versuche, dies so in C # zu konvertieren …
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");
}
}
}
Ich habe eine ganze Reihe von Fehlern, die ich derzeit nicht verstehe bzw. weiß, wie ich sie beheben kann.
Würde jemand zufällig wissen, wo ich falsch liege und vielleicht (hier kommt die freche Bitte …) einen funktionierenden Codeblock für mich mit einer Erklärung dafür bereitstellen, wo ich falsch gelaufen bin und was Ihr Code tut, damit es funktioniert.
—Aktualisieren—
Danke für die Hilfe @Mat J
Die neue Codeversion hier startet jetzt Photoshop, aber ich kann damit keine Dokumente öffnen.
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);
}
}
}
Lösung
Vorausgesetzt, Sie verwenden .NET 4 oder höher, können Sie Folgendes deklarieren PhotoshopInst
:dynamic
dynamic PhotoshopInst = Activator.CreateInstance(PhotoshopType);
Dann können Sie Methoden aufrufen, von denen Sie wissen, dass der zugrunde liegende Typ unterstützt wird, ohne dass sich der Compiler beschwert.
PhotoshopInst.Open(fl);
Beantwortet von – thabs
Antwort geprüft von – Marilyn (FixError Volunteer)