关于“Marshal.GetActiveObject(System.String)”方法的实现问题

问题描述 投票:0回答:1

我正在尝试连接到正在运行的 Solid Edge 实例,但是 我收到以下错误

System.MissingMethodException: 'Method not found: 'System.Object System.Runtime.InteropServices.Marshal.GetActiveObject(System.String)'

我一直在搜索关于此错误并且我发现了

我想制定另一个解决方案,对于我的项目来说更准确。我们的想法是使用 .NET Framework 4.8.1制作一个 DLL,然后在使用 .NET Core 7编程的另一个项目上使用它。这样我就为DLL制作了这个代码片段:

using System;
using System.Runtime.InteropServices;
 
namespace SolidEgde.OpenSDK
{
    public static class Comunication
    {
        /// <summary>
        /// Connects to or starts a new instance of Solid Edge.
        /// </summary>
        /// <param name="startIfNotRunning"></param>
        /// <returns>
        /// An object of type SolidEdgeFramework.Application.
        /// </returns>
        public static SolidEdgeFramework.Application Connect(bool startIfNotRunning)
        {
            SolidEdgeFramework.Application application = null;
 
            try
            {
                // Attempt to connect to a running instance of Solid Edge.
                application = (SolidEdgeFramework.Application)Marshal.GetActiveObject(PROGID.SolidEdge_Application);
            }
            catch { throw; }
 
            if (application != null)
                application.Visible = true;
 
            return application;
        }
    }
    public static class PROGID
    {
        public const string SolidEdge_Application = "SolidEdge.Application"; // HKEY_CLASSES_ROOT\SolidEdge.Application
    }
}

然后我从测试项目中调用它,如下所示:

namespace Testeo
{
    class Program
    {
        static void Main(string[] args)
        {
            SolidEdgeFramework.Application application = null;
 
            application = SolidEgde.OpenSDK.Comunication.Connect(true);
        }
    }
}

但是我得到了开头提到的错误。

PS:在我的项目中,我尝试连接到 Solid Edge CAD 程序的实例。

c# .net .net-core marshalling
1个回答
0
投票

根据@Hans Passant的评论,我搜索了有关遗留dll .NET Framework组件和.NET Core集成的更多信息,答案是:

不,不可能以安全的方式在一个项目中同时拥有两者。

为什么?

  • 它们针对一组不同的程序集(mscorlib 与 System.Runtime),这会导致不兼容,因为类型的所有用法都以类型所在的程序集为前缀。
  • .NET Core 可以引用.NET Framework 程序集。这允许引用程序集并成功编译。但这并不能保证在运行时成功执行,因为 .NET Core 不提供 .NET Framework 中的所有 API。

此问题参考:

© www.soinside.com 2019 - 2024. All rights reserved.