Aktifkan hanya pengikatan awal untuk kelas COM di C#

Saya membuat perpustakaan kelas dengan menggunakan C# yang akan digunakan dari VBA. Tapi ada satu hal yang membuat saya patah semangat - ketika saya menghapus atau mengubah beberapa huruf dalam nama metode dan mencoba mengkompilasi proyek vba maka saya tidak mendapatkan kesalahan. Tetapi saya ingin mendapatkan pesan kesalahan kompilasi jika, seperti yang saya ketahui, itu terjadi karena penggunaan pengikatan yang terlambat.

Saya akan mencoba menjelaskannya.

  1. Ini adalah tanda tangan yang benar:

    Sub Test()
      Dim cls as New SomeClass
      cls.SomeMethod
    End Sub
    
  2. Itu adalah tanda tangan dengan salah ejaan:

    Sub Test()
      Dim cls as New SomeClass
      cls.**SomeMetod**
    End Sub
    
  3. Tekan Kompilasi Proyek VBA - semuanya baik-baik saja, tetapi seharusnya tidak demikian.

Saya telah mengubah antarmuka dasar seperti yang ditunjukkan di bawah ini:

[Guid("Some GUID here"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IComInterface
{}

dan kelas dasar:

[ClassInterface(ClassInterfaceType.None)]
public class BaseClass

Tapi tidak terjadi apa-apa!!! Saya hanya mendapatkan kesalahan saat runtime.


person frippy    schedule 10.10.2012    source sumber
comment
Maka jangan gunakan pengikatan yang terlambat. Tambahkan perpustakaan tipe di alat vba apa pun yang Anda gunakan.   -  person Hans Passant    schedule 10.10.2012
comment
Maka jangan gunakan pengikatan yang terlambat - Saya tidak tahu cara membuat kelas saya menggunakan pengikatan awal   -  person frippy    schedule 10.10.2012
comment
Anda tidak bisa mendapatkan jawaban langkah demi langkah sampai Anda menjelaskan program berkemampuan vba yang Anda gunakan. Jika ini sebenarnya VBScript maka pengikatan awal tidak dapat dilakukan.   -  person Hans Passant    schedule 10.10.2012
comment
Perpustakaan saya saat ini menggunakan di Excel.   -  person frippy    schedule 10.10.2012


Jawaban (1)


Solusinya adalah:

    [Guid("Some GUID here"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IComInterface
    {}

dan kelas dasar:

    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class BaseClass

Sadarilah bahwa pembuatan versi kode Anda tidak akan didukung! Juga metode .NET seperti ToString(), GetHashCode() dll menjadi terlihat di VBA. Jadi, Anda perlu menggunakan atribut [ComVisible(false)] untuk metode ini. Ini akan berfungsi untuk ToString, GetHashCode, Equals. GetType tidak mungkin disembunyikan dalam kasus itu. Jadi, Anda perlu memutuskan apakah Anda perlu menyembunyikan metode .NET atau memiliki peringatan pengikatan dan kompilasi awal

person frippy    schedule 12.10.2012