0

当我尝试在 Sony Vegas Script 中使用 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");

我已经完整安装了最新的 .Net Framework (4.5)。索尼维加斯从哪里获得组件。

有什么建议么?

4

2 回答 2

1

好吧,那离我的床很近,我在 Sony Vegas 工作过,并且非常了解它的 CLR 托管方案。您遇到此问题是因为 System.IO.Pipes 是一个 .NET 4 命名空间,Vegas 中的自定义 CLR 主机加载 CLR 版本 2.0.50727。

您可以覆盖该选择,您可以编辑 Program Files 文件夹中的 .exe.config 文件并使用该<supportedRuntime>元素来加载 v4 版本。不确定这样做会遇到什么样的麻烦,否则它不是经过测试或支持的场景。

下一个最接近的替代方法是使用 Socket。通常比 WM_COPYDATA 更​​容易上手,因为您只需要选择一个端口号。获取窗口句柄可能很棘手,FindWindow() 不是一个非常可靠的函数。

于 2012-12-27T16:15:48.507 回答
0

Sony Vegas 托管的 CLR 似乎不支持 NamedPipeClientStream。我通过使用 Windows 中的消息系统实现了相同的行为。这是我在 Sony Vegas Script 中使用的代码

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 回答