0

我想使用 TypeCoverter 将 PIA 加载到 Excel 中的程序集中的枚举输出区域化。

我可以运行它,它适用于我使用显式引用的程序集创建的测试项目中的程序集,但是在运行已构建为 Excel PIA 的项目时。如果我尝试:_ public enum MyEnum ItemA ItemB end enum

并在代码 myE = MyEnum.ItemA Dim 转换器 As System.ComponentModel.TypeConverter = TypeDescriptor.GetConverter(myE)

在即时窗口中?converter.ToString() 管理“System.ComponentModel.EnumConverter”

而在我的另一个项目中(也是一个强签名的程序集,但直接从一个新创建的存根窗口表单项目中引用),我得到

? 转换器.ToString "ClassLibrary1.LocalizedEnumConverter"

所以看起来 LocalizedEnumConverter 没有绑​​定到枚举 - 有什么想法吗?这是因为 Excel 加载程序集的方式,有没有办法解决这个问题?

4

2 回答 2

0

类型转换器是否与枚举在同一个 dll 中?TypeDescriptor 必须能够解析类型转换器、UI 类型编辑器等 - 否则它使用简单的默认值。

我没有用 Excel 专门尝试过任何东西,但我想知道它是否不像程序集解析那么简单......

如果有帮助,您可以使用该AppDomain.AssemblyResolve事件来自定义程序集加载 - 但这是一个复杂的领域......除非绝对必要,否则我会避免它。

于 2008-10-19T15:00:12.670 回答
0

经过大量的挖掘,我找到了解决方案,这适用于无法解决加载的程序集:

为大会决议添加一个处理程序:

    Dim currentDomain As AppDomain = AppDomain.CurrentDomain
    AddHandler currentDomain.AssemblyResolve, AddressOf AssemblyResolve_EventHandler

然后处理决议:

Private Function AssemblyResolve_EventHandler(ByVal sender As Object, ByVal e As System.ResolveEventArgs) As System.Reflection.Assembly
    Dim asm() As System.Reflection.Assembly = System.AppDomain.CurrentDomain.GetAssemblies()

    For i As Integer = 0 To asm.Length
        If asm(i).FullName = e.Name Then
            Return asm(i)
        End If
    Next
    Return Nothing
End Function
于 2008-10-27T11:06:45.550 回答