簡體   English   中英

無法從VBA實例化用C#編寫的COM對象(VB6 ok)

[英]Can't instantiate a COM object written in C# from VBA (VB6 ok)

使用VS 2008,這是我的COM對象

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace TestCom
{    
    [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("Test9.COMINT")]
    public class TestComClass  
    { 
        public void Init(string userid, string password)
        {
            MessageBox.Show(string.Format("{0}/{1}", userid, password));
        }       
    }
}

如果我構建它並在生產機器上注冊如下

REGASM /CODEBASE TESTCOM.DLL

從一個簡單的VB6應用程序,這工作正常

Private Sub Form_Load()
  Dim o As Object
  Set o = CreateObject("Test9.COMINT")
  o.Init "A", "B" 
End Sub

這個完全相同的代碼從Excel中的VBA調用

“自動化錯誤”(0x80131700)

一切都在開發機器上運行良好,而不是只安裝了.NET和MS Office的生產機器上。

更新

我認為這與.NET框架在Excel下運行時未正確初始化有關。 如果我使用Filemon,我可以看到它跳過尋找MSCORWKS.DLL。 當我從VBScript調用相同的對象時,它發現MSCorwks.dll很好。

當我從VBA調用CorBindToCurrentRunTime嘗試強制加載CLR時,有趣的是我得到與在VBA中執行CreateObject()時完全相同的HRESULT (0x80131700)

因此我認為這是一個框架初始化問題。

我將回答我自己的問題,希望能夠讓別人忍受我剛剛忍受的乏味乏味的工作。

如果你得到這個,那因為基於.NET的COM程序集找不到.NET框架

解決方案很簡單。 創建包含以下內容的文件

<?xml version="1.0"?>
<configuration>
  <startup>
   <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

將其命名為“Excel.Exe.Config”並將其放在與“EXCEL.EXE”相同的目錄中

問題解決了!

RC1,我使用您的VBScript代碼和Office 2007的Excel中的代碼進行了測試,一切正常。

由於您能夠在VB6表單中創建COM對象,因此我們應該假設您的.net框架正常。 你能排除VBA的問題嗎? 你可以創建一個.vbs文件並將其放入其中:

Dim o As Object  
Set o = CreateObject("Test9.COMINT")  
o.Init "A", "B"

保存文件並雙擊它。 如果你收到錯誤,那么我認為注冊時會出現問題,如果你沒有收到錯誤,那么我會查看Office和VBA,看看是否有東西丟失或者沒有正確安裝。

另一個選擇是添加對COM對象的引用並使用早期綁定? 我認為您可能需要先導出一個類型庫,但您應該能夠添加一個引用並簡單地添加該對象。

這適用於VBA ...我嘗試使用Word和Excel 2003(SP3)。

我不確定你的“生產”機器是什么意思。 因為這是一個“客戶端”應用程序,必須使用Excel在客戶端上執行。

如果您在服務器上自動化Excel並通過VBA調用觸發此“互操作”,那么您就會遇到麻煩:)

假設通過生產,您指的是用戶將使用Excel模板/ doc的客戶端計算機,這些是以下指針:

  1. 確保您擁有適當的.Net框架
  2. 您有最新的Office服務包
  3. 嘗試確定這是否是權利問題。

如果您感覺具有冒險性,可以使用進程資源管理器[來自Microsoft sysinternals站點]來查看加載的DLL是什么,以及您在何處獲得錯誤並將其與開發框中的列表進行比較。

希望這可以幫助。

rc1是正確的,因為這一個.net錯誤,當Office無法決定使用哪個版本的Framework時拋出。 然而,辦公室並沒有因為它的選擇而受到損害。 Office 2003與.net 2.0的交互方式存在一個錯誤。

從Microsoft( KB908002 )安裝修復程序是一種更靈活的方法來解決問題,而不是強制Excel在特定版本的.net中運行。

另見: http//www.biopdf.com/guide/trouble_shoot_microsoft_office_2003.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM