【问题标题】:Cast is invalid on object对象上的强制转换无效
【发布时间】:2020-02-16 12:05:37
【问题描述】:

我有这个问题,当我尝试强制转换“批处理”对象时,我会引发异常“无效强制转换”。 你能帮我解释一下为什么吗? Vault5 对象存在且正确。

public void batch(IEdmVault5 vault5)
{
    edmVault11 = (IEdmVault11)vault5;
    IEdmBatchRefVars batch = default(IEdmBatchRefVars);
    batch = (IEdmBatchRefVars)edmVault11.CreateUtility(EdmUtility.EdmUtil_BatchRefVars);

    //some code
}

编辑 1: 错误信息:

System.InvalidCastException H结果=0x80004002 Messaggio=Cast specificato 无效

【问题讨论】:

  • 不,不是来自您提供的代码。我们不知道您在那里使用的是什么库以及正确的类型是什么。检查CreateUtility 的声明以查看它返回的类型。或者使用调试器,如果类型取决于参数(看起来像)。
  • 另请注意,最好在一个步骤中声明变量并将其初始化为有用的值:IEdmBatchRefVars batch = (IEdmBatchRefVars)edmVault11.CreateUtility(EdmUtility.EdmUtil_BatchRefVars);。将其初始化为 default(IEdmBatchRefVars) 然后立即为其分配新值是没有意义的。
  • @PMF ,这是 Solidworks ePDM API 示例可以参考这里help.solidworks.com/2017/English/api/epdmapi/…
  • 您的保管库可能为空,但您的代码还有其他我们看不到的问题。

标签: c# solidworksapi solidworkspdmapi


【解决方案1】:

我今天遇到了这个。解决方案是在 STA 模式下为当前线程初始化 COM。

  • 对于 WinForms 应用程序,这已针对主/UI 线程完成(因此可能不适用)。
  • 对于控制台应用,请考虑将 [STAThread] 添加到您的 Main() 方法中。
  • 如果您在后台线程或任务上运行它,则需要直接操作线程状态。

【讨论】:

    【解决方案2】:

    我建议你也试试这个改变

     public void batch(IEdmVault5 vault5)
    {
        IEdmVault7 edmValult11 = null;
        if (vault5 == null)
        {
               vault5 = new EdmVault5();
        }
        edmVault11 = (IEdmVault11)vault5;
        IEdmBatchRefVars batch = default(IEdmBatchRefVars);
        batch = (IEdmBatchRefVars)edmVault11.CreateUtility(EdmUtility.EdmUtil_BatchRefVars);
    
        //some code
    }
    

    除了 Solidworks API 的性质外,请确保安装和许可证有效。

    【讨论】:

    • 感谢您的回答,我曾尝试验证对象是否与 null 不同,不幸的是问题仍然存在。
    • 将空引用转换为任何引用类型都不会给出InvalidCastException。如果 vault5 为空,则 OP 会看到 NullReferenceException(除非 CreateUtility 是扩展方法)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多