[英]ASP.NET MVC - RuntimeBinderException when passing dynamic ExpandoObject from Controller to View
[英]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.