2011-08-28 6 views
5

ho creato una DLL COM-interoperabilità con questa semplice classe:errore di automazione quando un'istanza di una classe .Net visibile COM

using System.Runtime.InteropServices; 

namespace ClassLibrary1 
{ 
    [ComVisible(true)] 
    [Guid("795ECFD8-20BB-4C34-A7BE-DF268AAD3955")] 
    public interface IComWeightedScore 
    { 
     int Score { get; set; } 
     int Weight { get; set; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[Guid("9E62446D-207D-4653-B60B-E624EFA85ED5")] 
public class ComWeightedScore : IComWeightedScore 
{ 

    private int _score; 

    public int Score 
    { 
     get { return _score; } 
     set { _score = value; } 
    } 
    private int _weight; 

    public int Weight 
    { 
     get { return _weight; } 
     set { _weight = value; } 
    } 

    public ComWeightedScore() 
    { 
     _score = 0; 
     _weight = 1; 
    } 
    } 

} ho registrato usando: C: \ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ regasm C: \ ComClasses \ Classlibrary1.dll/tlb: Classlibrary1.tlb

Infine ho aggiunto con successo un riferimento alla .dll dopo il quale VB6 mi ha dato intellisense sull'oggetto.

Private Sub Form_Load() 
    Dim score1 As ComWeightedScore 

    Set score1 = New ComWeightedScore 
    score1.Score = 500 

End Sub 

Sulla linea Set score1=new ComWeightedScore viene sollevata un'eccezione Errore di automazione.

Difficilmente può essere più semplice di così ... Dov'è l'errore ?!

+0

E perché dici che l'errore è nell'assegnare int o long? ciò che fallisce è la chiamata del costruttore. Funziona ancora se rimuovi i compiti dal corpo del costruttore? Inoltre, fornire maggiori informazioni e dettagli sull'errore che si ottiene. –

risposta

7

hai dimenticato il/codebase opzione nella riga di comando Regasm.exe.

In caso contrario, sarà necessario assegnare un nome sicuro all'assembly e inserirlo nel GAC con gacutil.exe. Buona idea sul computer client, solo sul tuo.

3

Se si utilizza un processore a 64 bit con la compilazione del progetto come "CPU-Any", è necessario compilare solo per x86 o registrare la DLL nello spazio COM + a 64 bit.

Esempio 32 e 64bit regasm:

% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ regasm "Contoso.Interop.dll" /tlb:Contoso.Interop.tlb /codebase Contoso .Interop

% windir% \ Microsoft.NET \ Framework64 \ v4.0.30319 \ regasm "Contoso.Interop.dll" /tlb:Contoso.Interop.tlb/codebase Contoso.Interop