0

Sony VegasスクリプトでNamedPipeClientStreamを使用しようとすると、例外が発生します

The type or namespace name 'NamedPipeClientStream' could not be found (are you missing   
a using directive or an assembly reference?)

The type or namespace name 'Pipe' could not be found in System.IO (are you missing     
a an assembly reference?)

これは私のコードがどのように見えるかです:

new System.IO.Pipes.NamedPipeClientStream("UniqueString");

最新の.NetFramework(4.5)を完全にインストールしました。SonyVegasはどこでアセンブリを入手しますか。

助言がありますか?

4

2 に答える 2

1

まあ、それは私のベッドに近いです、私はソニーベガスに取り組んできました、そしてそのCLRホスティングシナリオをかなりよく知っています。System.IO.Pipesは.NET4名前空間であり、VegasのカスタムCLRホストはCLRバージョン2.0.50727をロードするため、この問題が発生します。

この選択を上書きし、Program Filesフォルダー内の.exe.configファイルを編集し、その<supportedRuntime>要素を使用してv4バージョンをロードすることができます。これを行う際にどのような問題が発生するかはわかりません。それ以外の場合は、テストまたはサポートされているシナリオではありません。

次に近い代替手段は、代わりにソケットを使用することです。ポート番号を選択するだけでよいので、通常はWM_COPYDATAよりも簡単に実行できます。ウィンドウハンドルの取得には注意が必要な場合があります。FindWindow()は信頼性の高い関数ではありません。

于 2012-12-27T16:15:48.507 に答える
0

Sony VegasによってホストされているCLRは、NamedPipeClientStreamをサポートしていないようです。Windowsのメッセージシステムを使用して同じ動作を実現しました。これがSonyVegasスクリプトで使用するコードです

public static class SonyVegasWindowMessageHelper
{
    private const int WM_USER = 0x400;
    private const int WM_COPYDATA = 0x4A;
    private const int VIDEO_RENDERED = 52;

    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, ref COPYDATASTRUCT lParam);


    public static void SendMessage(string message)
    {
        IntPtr window = FindWindow(null, "Youtube Video Uploader");
        if (window != IntPtr.Zero)
        {
            byte[] data = Encoding.Default.GetBytes(message);

            COPYDATASTRUCT str = new COPYDATASTRUCT();
            str.CbData = data.Length + 1;
            str.DwData = (IntPtr)VIDEO_RENDERED;
            str.LpData = message;

            SendMessage(window, WM_COPYDATA, IntPtr.Zero, ref str);
        }
    }

    private struct COPYDATASTRUCT
    {
        public IntPtr DwData;
        public int CbData;

        [MarshalAs(UnmanagedType.LPStr)]
        public string LpData;
    }
}

SendMessageを使用すると、必要なメッセージを他のアプリケーションに送信できます。

于 2012-12-27T15:23:58.057 に答える