web-dev-qa-db-ja.com

WinscpとSSISパッケージは、System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj、Object []パラメーター、Object []引数)を提供します。

Nugetインストーラーを使用してWinSCP.netをインストールしました。

Visual Studio 2013

SSIS BIDS 2012

プロジェクト参照は正しいです-インストールされたDLL

プロジェクトには、winscpサイトからのサンプルコードの簡略版である1つのスクリプトが含まれています。 SessionOptionsオブジェクトをインスタンス化しようとする最初の行で失敗します。 SessionOptionsオブジェクトを削除すれば、問題ありません。

指示に従ってGACにwinscpnet.dllを登録しました。

visual Studio ssisデバッガーでスクリプトを開始し、これを取得します。

system.RuntimeMethodHandle.InvokeMethod(オブジェクトターゲット、Object []引数、Signature sig、ブールコンストラクター)at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj、Object []パラメーター、Object []引数)atSystem.Reflection.RuntimeMethodInfo。 Invoke(Object obj、BindingFlags invokeAttr、バインダーバインダー、Object []パラメーター、CultureInfoカルチャー)
[。 .ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

    public void Main()
    {

        SessionOptions sessionOptions = new SessionOptions
        {
            Protocol = Protocol.Sftp,
            // To setup these variables, go to SSIS > Variables.
            // To make them accessible from the script task, in the context menu of the task,
            // choose Edit. On the Script task editor on Script page, select ReadOnlyVariables,
            // and tick the below properties.
            HostName = "",
            UserName = "",
            Password = "",
            SshHostKeyFingerprint = ""
        };

            bool fireAgain = false;

         Dts.Events.FireInformation(0, null,
                        string.Format("Upload of  succeeded"),
                        null, 0, ref fireAgain);



            Dts.TaskResult = (int)DTSExecResult.Success;
    }

フローとプロセスのスクリーンショットを追加する

Heres the packageScript detailsError when I run itDebug spew

更新:コードを次のように変更しました...まったく同じ結果

        public void Main()
    {
        bool fireAgain = false;

        try
        {
            SessionOptions sessionOptions = new SessionOptions
            {
                Protocol = Protocol.Sftp,
                // To setup these variables, go to SSIS > Variables.
                // To make them accessible from the script task, in the context menu of the task,
                // choose Edit. On the Script task editor on Script page, select ReadOnlyVariables,
                // and tick the below properties.
                HostName = "",
                UserName = "",
                Password = "",
                SshHostKeyFingerprint = ""
            };
        }
        catch (Exception ex)
        {

            Dts.Events.FireInformation(0, null,
                           ex.InnerException.Message,
                           null, 0, ref fireAgain);
        }               

            Dts.TaskResult = (int)DTSExecResult.Success;
    }
9
Shaun Neal

サードパーティDLLがSSISスクリプトタスクで使用されている場合、GACを実行する必要があります。

コマンドプロンプトを開いてください。

cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools"

次のコマンドを実行します。

gacutil -i <"Path of WinSCP DLL">

GACコマンドを実行した後、Scripタスクは期待どおりに実行されます。実行時にSSISはDLL参照を取得できず、それがこのエラーの原因です。

これがうまくいくことを願っています!!

13
Nicky Thakkar

私はこれが古い問題であることを知っていますが、うまくいけばこれが役立つでしょう。基本的に必要なのは、public void mainの外にあるこのコードのチャンクです。

public class example
{
    static ScriptMain()
    {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    }

    static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        if (args.Name.Contains("WinSCPnet"))
        {
            string path = @"Path to DLL";
            return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "WinSCPnet.dll"));
        }
        return null;
    }
    public void Main()
    { can now use DLL things in here}
}

もちろん、using WinSCP;を追加して参照に追加してください。幸運を。

1
Fred Montoya

Try catchブロックで掘り下げた後、C#デリゲートイベントの呼び出しでこれと同じ例外が発生し、stacktraceの助けを借りて、イベントハンドラーメソッドの1つから1つの例外がスローされたことがわかりました。修正後、正常に動作し始めました。

0
Rahul Sonone