所有通过PowerShell自动化Excel的示例都以此行开头:
PS> $Excel = New-Object -Com Excel.Application
Run Code Online (Sandbox Code Playgroud)
这似乎是处理一个新的Excel实例,例如运行$Excel.Visiable = $true将显示一个空的空白Excel窗口,而不是切换到现有的工作簿.
如果已经运行了Excel实例,有没有办法连接到它?
所有:
我在将一些VBA代码转换为C#时遇到了一些问题.
我们有一个第三方应用程序,它充当本地COM服务器.
在VBA代码中,我们使用GetObject()来获取对现有对象的引用
例如
Set appHandle = GetObject("", ProgId)
Run Code Online (Sandbox Code Playgroud)
这很好用.
我在c#代码中添加了对第三方应用程序的引用,并使用 Marshal.GetActiveObject()来尝试获取对正在运行的实例的引用.
例如
var appModel = (IAppCoModel)Marshal.GetActiveObject(ProgId);
Run Code Online (Sandbox Code Playgroud)
但我一直收到MK_E_UNAVAILABLE错误.
在C#代码中创建新对象可以正常工作
例如
var appModel = new AppCoModel()
Run Code Online (Sandbox Code Playgroud)
这将启动第三方应用程序,并允许我与它进行通信.它只是抓取对正在运行的实例失败的引用.
我试过的
不同的安全上下文
VS在管理模式下运行,第三方应用程序不是.我尝试从命令行运行我们的c#app(非管理员).仍然失败.
检查ROT内容
(由Marshal.GetActiveObject()建议在C#中抛出MK_E_UNAVAILABLE异常)
第三方应用程序不会出现在其中.不知道足够的COM以确保它需要.
检查所有注册表条目
看起来不错(据我所见),它们足以创建第三方应用程序和实例以及VBA找到它.有什么特别的,我应该在这里查看?
任何人们可以提出的建议将不胜感激.