【问题标题】:Can I pass a [Serializable] object via Clipboard into an Excel AddIn?我可以通过剪贴板将 [Serializable] 对象传递到 Excel 插件吗?
【发布时间】:2014-12-03 17:39:14
【问题描述】:

我有 2 个应用程序:一个基于 WPF DataGrid,另一个是 Excel AddIn。

我的目标是通过剪贴板将数据从前者传递到后者。

将制表符分隔的 cuadriculated 数据复制到常规 Excel“粘贴”操作中没有问题。此外,我还实现了自己的“智能粘贴”。

当我决定复制+粘贴一个更复杂的对象时,我的麻烦就开始了。我将我所有的类都标记为 [Serializable] 并且有一个方法可以确保对象可以被序列化。事实上,只要粘贴应用程序不是 Excel 插件,整个操作就可以完美运行。

传递的对象属于名为 Engineering.Export.Exported 的类。如我们所见,剪贴板看起来不错:

请参阅 3 条相关声明。它们在两个应用程序中是相同的。

最后一次分配仅在我需要的应用程序中失败。

我尝试了很多组合,例如 GetData("ExportFormat") 但结果都是一样的。

非常欢迎任何提示、建议。

TIA

加法:

我准备了一个超级简单的对象:

namespace Engineering
{
    [Serializable]
    public class SimpleStuff
    {
        public string Greetings;
        public int GraduationYear;
        public bool Available;
    }
}

问题仍然存在:我可以将它导出到任何应用程序中除了一个 VSTO 插件。最后一条语句在 AddIns 中总是返回 null。

【问题讨论】:

  • 你如何告诉插件你的类型Exported(或测试用例SimpleStuff)是如何定义的?它是否链接到定义类型的实际库?其他一些机制,例如COM 类型库?
  • Eric:我只是在源代码级别声明了两者相同。
  • 我的问题仍然存在:有人能做到这一点吗?
  • Eric:你的评论让我思考。如果公司“A”执行复制的应用程序,而公司“B”执行粘贴的应用程序怎么办?他们在源代码级别达成一致是有道理的,而不必执行一些常见的链接。
  • 好久没用剪贴板了……能不能把剪贴板数据作为二进制数据,检查一下是否完全符合预期,而不是直接从剪贴板反序列化?跨度>

标签: c# wpf excel vsto


【解决方案1】:

如果你擅长调试,你可以“测试”类型是什么:

private void pasteButton_Click(object sender, RoutedEventArgs e)
{
    var dataObject = Clipboard.GetDataObject();
    if (dataObject != null) {
        Exported incomingObject;
        if (dataObject.GetDataPresent(typeof(Exported))) {
            incomingObject = dataObject.GetData(typeof(Exported));
        } else {
            var obj = dataObject.GetData(typeof(Object));
            incomingObject = obj as Exported;
        }
        if (incomingObject != null) {
          // what you want to do with it can go here
        }
    }
}

Console.WriteLine 上放一个断点,看看dataType 变量是什么。

当然,请确保您只使用您感兴趣的数据类型进行测试。

让我知道这是怎么回事。

【讨论】:

  • 对象类型。
  • 然后在获取值后,将其转换为您的数据类型。我将更新代码示例......
  • 我当然认为 Exported 是您正在使用的类的名称。
【解决方案2】:

在对非插件应用程序进行了一些实验后,我发现了问题。有问题的语句没有返回 null,而是失败并显示有关缺少程序集的错误消息。

解决方案是创建一个单独的 MSVS 项目,其中仅包含要传输的对象,对其进行编译并在所涉及的两个应用程序中添加对它的引用。

感谢埃里克·J。

【讨论】:

    猜你喜欢
    • 2022-08-06
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多