2013-08-19 45 views
0

我一直在研究一個簡單的dll庫,這個庫可以通過com訪問,以便其他軟件可以使用我們的庫(來自任何託管或非託管語言)。C#com在美國機器上的interopt失敗

創建一個COM DLL訪問是童話容易:

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

namespace MyNamespace 
{ 
    //This interface defines purely the events. DotNetEventSender should implement this interface with the ComSourceInterfaces() attribute 
    //to become an Event Source. 
    [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    public interface COMEventsInterface 
    { 
     //[DispId(1)] 
     // we don't have any events, but if needed, include them here 

    } 

    [ComVisible(true)] 
    public interface ICOM 
    { 
     //Methods 
     int Sum(int[] intsToSum) 
    } 

//Identifies this interfaces that are exposed as COM event sources for the attributed class. 
    [ComSourceInterfaces(typeof(COMEventsInterface))] 
    //Tells the compiler not to generate an interface automatically and that we are implementing our own interface (IDotNetEventSender) 
    [ClassInterface(ClassInterfaceType.None)] 
    [ComVisible(true)] 
    public class COM : ICOM 
    { 

     // Methods 
     public int Sum(int[] intsToSum) 
     { 
      int sum = 0; 
      foreach (int i in intsToSum) 
      { 
       sum += i; 
      } 
      return sum; 
     } 
    } 
} 

在調試模式在現在將標誌着該項目通過項目>屬性>生成>註冊爲COM Interop的COM的互操作註冊。

在發佈模式中,我有一個安裝程序,它將我項目的主要輸出標記爲「vsdrpCOM」。

這在大多數情況下效果很好。但不知何故,在某些機器上(全美國),這是行不通的。 com類獲得註冊,但我不斷得到錯誤:HRESULT 0x80131534,這實際上已經在這裏descibed SO:Error when instantiating .NET/COM interop class via classic ASP

但是,真的,我沒有看到任何解決方案在這裏。我檢查了用戶權限,域權限,...

編輯: 我真正的類的構造函數這樣一兩件事: (我已經添加了嘗試捕捉,因爲我發現,使這是一個錯誤在構造函數中...)

// Constructor 
    public COM() 
    { 
     try 
     { 
      // register itself with the application 
      MyApplication.COMObject = this; 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

它只是將自己註冊到一個靜態類的財產COMObject:

private static COM _comObject; 
public static COM COMObject 
     { 
      get 
      { 
       return _comObject; 
      } 
      set 
      { 
       _comObject = value; 
      } 
     } 

雖然,COM類並不真的需要自己註冊,我如果我想觸發夏娃,我已經做了這個以備將來使用nts

+0

如果您直接在託管代碼中使用它,會發生什麼情況? – SLaks

+0

這真的是你的代碼嗎?沒有字符串,沒有DateTime,四處走動... – xanatos

+0

更可能是[TypeInitializationException](http://msdn.microsoft.com/en-us/library/system.typeinitializationexception.aspx):* TypeInitializationException使用HRESULT COR_E_TYPEINITIALIZATION ,它的值爲0x80131534 * - ops,抱歉,沒有遵循您發佈的鏈接,其中包含該信息 – Noseratio

回答

0

嗯,我碰巧是我有錯誤宣佈一個DateTime在我的一個靜態類的聲明...私人日期時間myDateTime = Convert.ToDateTime(「15/09/2013 12:00:00」 );

而且ofcourse,一個歐盟系統上,這會工作,但在美國(甚至其他人)因爲沒有第15個月這給出了一個錯誤......

這變得更加的構造函數之前觸發我的COM可訪問的類,這就是爲什麼錯誤無法處理。

愚蠢的錯誤,但證明有時錯誤看起來非常複雜,而它們很簡單。

相關問題