簡體   English   中英

RuntimeBinderException通過動態將非0的Enum值傳遞給.Net Com程序集

[英]RuntimeBinderException passing Enum values other then 0 to a .Net Com Assembly via dynamic

我有一個第一個C#程序集,它公開了一個類和一個枚舉

namespace TestComLibraryInCSharp
{
    [Guid("A5AE3B4C-7788-4394-A949-98A9F78A8E00")]
    [ComVisible(true)]
    public enum ColorType
    {
        Red = 0,
        Green = 1,
        Blue = 2
    }

    [Guid("EF5D9F9C-DAAB-472E-A418-114F0352F06E")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [ComVisible(true)]
    public interface IComClassUsingEnum
    {
        void Select(ColorType color);
    }

    [Guid("5EDE0D14-3A3B-41E7-93BC-40868BC68655")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    public class ComClassUsingEnum : IComClassUsingEnum
    {
        public void Select(ColorType color)
        {
            MessageBox.Show("you have selected " + color.ToString());
        }
    }

}

在另一個程序集中,我想使用動態測試上述接口

    public void DoTestColor()
    {
        Type type = Type.GetTypeFromProgID("TestComLibraryInCSharp.ComClassUsingEnum");
        dynamic c = Activator.CreateInstance(type);

        c.Select(0); // this works
        c.Select(1); // this throws RuntimeBinderException
    }

c.Select(0)用於顯示消息框

c.Select(1)(或除0以外的任何其他數字)將生成此異常

An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll
Additional information: The best overloaded method match for 'TestComLibraryInCSharp.ComClassUsingEnum.Select(TestComLibraryInCSharp.ColorType)' has some invalid arguments

在VBA中,后期綁定,一切正常

Dim c As Object
Set c = CreateObject("TestComLibraryInCSharp.ComClassUsingEnum")
c.Select 1

在C#中傳遞帶有后期綁定的枚舉值的正確方法是什么?

這是一個很好的例子,它演示了在.NET中編寫COM服務器測試代碼實際上根本沒有測試COM互操作。 為什么IDE反對添加對類型庫的引用是一個非常合理的抱怨。 CLR並不是那么容易上當,它可以在運行時看到您創建了一個.NET對象,它不會為其創建RCW。 不要因為生活更有效率而讓生活變得困難。

否則,這是完全正常的例外。 DLR遵循C#語言規則,只有默認值(0)可以隱式轉換為枚舉類型。 它堅持要看到ColorType,否則,您將在C#程序中使用強制轉換。 在后期綁定的情況下,這很難做到,您不能為枚舉類型提供ProgId。 需要某種偷偷摸摸的后門反射代碼,這遠遠超出了合理測試中的合理范圍。

鑒於您實際上根本沒有測試COM互操作,因此不妨提出這個問題並添加一個普通的.NET參考。 現在很簡單。 只有VBA測試代碼才能執行COM互操作管道。

盡管漢斯是對的,但解決方案可能是這樣

public ColorType GetColorTypeFromInt(int colorTypeAsInt)
{
    return (ColorType) colorTypeAsInt;
}

也就是說,在COM庫中,公開了一些幫助方法,該方法將從int強制轉換為正確的枚舉類型(這可能是Hans所謂的“偷偷摸摸的后門”)。

十分丑陋,但回答了我的原始問題。

暫無
暫無

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

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