用C#访问监听模式的LibreOffice时透明代理转换失败

我现在需要编写程序连接一个远程的LibreOffice服务以完成文档操作,我按照unoidl文档编写了C#程序,前面一切正常,但在最后一步创建Desktop实例时出错,异常为“无法将透明代理强制转换为类型“unoidl.com.sun.star.frame.XDesktop”。’”,非常奇怪,明明成功创建了Desktop的实例(没有抛异常,也没有返回null)但是却不能转换为XDesktop,调用本地的LibreOffice就没有问题。是unoidl的bug吗?希望有高人指点,感激!

服务器:Windows

语言:C# .Net Framework 4.8

LibreOffice: 25.2.4

LibreOffice SDK: 25.2.4

监听命令行:
soffice.exe --headless --accept=“socket,host=localhost,port=8100;urp;” --nofirststartwizard

完整代码:
Snippet

string unoUrl = “uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager”;

var localContext = Bootstrap.defaultBootstrap_InitialComponentContext();
if (localContext == null)
throw new System.Exception(“failed to load local context”);

            var localFactory = localContext.getServiceManager();

            var connector = (XConnector)localFactory.createInstanceWithContext("com.sun.star.connection.Connector", localContext);

            var urlArray = unoUrl?.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            if (urlArray == null || urlArray.Length != 3)
                throw new System.Exception("failed to parse uno url");

            var connection = connector.connect(urlArray[0].Replace("uno:", ""));

            var bridgeFactory = (XBridgeFactory)localFactory.createInstanceWithContext("com.sun.star.bridge.BridgeFactory", localContext);

            var bridge = bridgeFactory.createBridge("", urlArray[1], connection, null);

            var remoteFactory = (XMultiComponentFactory)bridge.getInstance(urlArray[2]);

            var properySet = (XPropertySet)remoteFactory;

            _context = (XComponentContext)properySet.getPropertyValue("DefaultContext").Value;
            if (_context == null)
                throw new System.Exception("failed to load context");

            var desktop = (XDesktop)remoteFactory.createInstanceWithContext("com.sun.star.frame.Desktop", _context);
            
            var loader = (XComponentLoader)desktop;
            if (loader == null)
                throw new System.Exception("failed to get component loader");

            return loader;
1 Like

我已经解决了这个问题,添加一个系统环境变量URE_BOOTSTRAP=file:///c:/Program%20Files/LibreOffice/program/fundamental.ini就可以了,谢谢

1 Like