เปิดใช้งานเฉพาะการเชื่อมโยงล่วงหน้าสำหรับคลาส COM ใน C #

ฉันกำลังสร้างไลบรารีคลาสโดยใช้ C# ที่จะใช้จาก VBA แต่มีสิ่งหนึ่งที่ทำให้ฉันท้อใจ - เมื่อฉันลบหรือเปลี่ยนตัวอักษรบางตัวในชื่อเมธอดและพยายามคอมไพล์โปรเจ็กต์ vba ฉันจะไม่ได้รับข้อผิดพลาด แต่ฉันต้องการได้รับข้อความแสดงข้อผิดพลาดในการคอมไพล์หากฉันพบว่ามันเกิดขึ้นเนื่องจากการใช้การรวมล่าช้า

ฉันจะพยายามอธิบาย

  1. เป็นลายเซ็นที่ถูกต้อง:

    Sub Test()
      Dim cls as New SomeClass
      cls.SomeMethod
    End Sub
    
  2. เป็นลายเซ็นที่มีการสะกดผิด:

    Sub Test()
      Dim cls as New SomeClass
      cls.**SomeMetod**
    End Sub
    
  3. กดคอมไพล์โครงการ VBA - ทุกอย่างโอเค แต่ไม่ควรเป็นเช่นนั้น

ฉันได้เปลี่ยนอินเทอร์เฟซพื้นฐานตามที่แสดงด้านล่าง:

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

และคลาสพื้นฐาน:

[ClassInterface(ClassInterfaceType.None)]
public class BaseClass

แต่ไม่มีอะไรเกิดขึ้น!!! ฉันได้รับข้อผิดพลาดขณะรันไทม์เท่านั้น


person frippy    schedule 10.10.2012    source แหล่งที่มา
comment
จากนั้นอย่าใช้การผูกล่าช้า เพิ่มไลบรารีประเภทในเครื่องมือ vba ที่คุณใช้   -  person Hans Passant    schedule 10.10.2012
comment
ถ้าอย่างนั้นอย่าใช้การผูกล่าช้า - ฉันไม่รู้วิธีทำให้คลาสของฉันใช้การผูกล่วงหน้า   -  person frippy    schedule 10.10.2012
comment
คุณไม่สามารถรับคำตอบทีละขั้นตอนได้จนกว่าคุณจะอธิบายว่าคุณใช้โปรแกรมที่เปิดใช้งาน vba ใด หากนี่คือ VBScript จริง ๆ จะไม่สามารถทำการผูกล่วงหน้าได้   -  person Hans Passant    schedule 10.10.2012
comment
ห้องสมุดของฉันใช้ใน Excel ในปัจจุบัน   -  person frippy    schedule 10.10.2012


คำตอบ (1)


วิธีแก้ไขคือ:

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

และคลาสพื้นฐาน:

    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class BaseClass

โปรดทราบว่าระบบไม่รองรับการกำหนดเวอร์ชันของโค้ดของคุณ! นอกจากนี้ วิธีการ .NET เช่น ToString(), GetHashCode() ฯลฯ ก็ปรากฏให้เห็นใน VBA ดังนั้นคุณจะต้องใช้แอตทริบิวต์ [ComVisible(false)] สำหรับวิธีการเหล่านี้ สิ่งนี้จะใช้ได้กับ ToString, GetHashCode, Equals GetType ไม่สามารถซ่อนได้ในกรณีนั้น ดังนั้นคุณต้องตัดสินใจว่าจะต้องซ่อนวิธีการ .NET หรือมีคำเตือนการเชื่อมโยงและการแก้ไขล่วงหน้าหรือไม่

person frippy    schedule 12.10.2012