0

TypeCoverterを使用して、Excelに読み込まれたPIAであるアセンブリ内の列挙型の出力を地域化したいと思います。

これを実行でき、明示的に参照されたアセンブリを使用して作成したテストプロジェクトのアセンブリで機能しますが、ExcelPIAとしてビルドされたプロジェクトを実行する場合は機能します。試してみると:_ public enum MyEnum ItemA ItemB end enum

コード内でmyE=MyEnum.ItemADimコンバーターAsSystem.ComponentModel.TypeConverter= TypeDescriptor.GetConverter(myE)

即時ウィンドウで?converter.ToString()は「System.ComponentModel.EnumConverter」を取得します

一方、他のプロジェクト(これも強く署名されたアセンブリですが、新しく作成されたスタブウィンドウフォームプロジェクトから直接参照されます)では、

?converter.ToString "ClassLibrary1.LocalizedEnumConverter"

したがって、LocalizedEnumConverterが列挙型にバインドされていないように見えます-何かアイデアはありますか?これは、Excelがアセンブリを読み込む方法が原因でしょうか。また、これを回避する方法はありますか?

4

2 に答える 2

0

型コンバーターは列挙型と同じ dll にありますか? TypeDescriptor は、型コンバーター、UI-type-editors などを解決できる必要があります。それ以外の場合は、単純な既定値が使用されます。

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 に答える