第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單組裝件多語言Windows窗體部署(ILMerge和附屬組裝件/本地化)-可能嗎?

單組裝件多語言Windows窗體部署(ILMerge和附屬組裝件/本地化)-可能嗎?

C#
有只小跳蛙 2019-11-26 15:08:53
我有一個使用Visual Studio 2008構(gòu)建的簡單Windows窗體(C#、. NET 2.0)應(yīng)用程序。我想支持多種UI語言,并使用表單的“ Localizable”屬性以及特定于文化的.resx文件,本地化方面可以無縫且輕松地工作。Visual Studio會自動將區(qū)域性特定的resx文件編譯為附屬程序集,因此在我的已編譯應(yīng)用程序文件夾中,包含這些區(qū)域性程序集的特定于區(qū)域性的子文件夾。我希望將應(yīng)用程序作為單個程序集部署(復(fù)制到位),但仍保留包含多組特定于文化的資源的能力。使用ILMerge(或ILRepack),我可以將附屬程序集合并到主要的可執(zhí)行程序集中,但是標準的.NET ResourceManager后備機制找不到編譯到主要程序集中的特定于區(qū)域性的資源。有趣的是,如果將合并的(可執(zhí)行)程序集放入其特定于區(qū)域性的子文件夾中,則一切正常!同樣,當(dāng)我使用Reflector(或ILSpy)時,可以在合并的assemby中看到主要資源和特定于文化的資源。但是將主程序集復(fù)制到特定于文化的子文件夾中仍然無法實現(xiàn)合并的目的-我真的需要只有單個程序集的一個副本...我想知道是否有任何方法可以劫持或影響ResourceManager后備機制,以在同一程序集中而不是在GAC和以文化命名的子文件夾中查找特定于文化的資源。我看到了以下文章中描述的回退機制,但是沒有關(guān)于如何修改的線索:Resource Manager上的BCL團隊博客文章。有誰有想法嗎?這似乎是一個在線上相對頻繁的問題(例如,Stack Overflow上的另一個問題:“ ILMerge和本地化資源程序集 ”),但是我在任何地方都沒有找到任何權(quán)威性的答案。
查看完整描述

3 回答

?
交互式愛情

TA貢獻1712條經(jīng)驗 獲得超3個贊

基本解決方案

遵循casperOne的建議,我終于能夠完成這項工作。


我將解決方案代碼放在問題中,因為casperOne提供了唯一的答案,我不想添加自己的答案。


通過將膽量從“ InternalGetResourceSet”方法中實現(xiàn)的Framework資源查找后備機制中剔除,并使我們的程序集搜索成為第一個使用的機制,我能夠使其工作。如果在當(dāng)前程序集中找不到該資源,則我們調(diào)用base方法來啟動默認的搜索機制(由于下面的@Wouter注釋)。


為此,我派生了“ ComponentResourceManager”類,并覆蓋了僅一個方法(并重新實現(xiàn)了私有框架方法):


class SingleAssemblyComponentResourceManager : 

    System.ComponentModel.ComponentResourceManager

{

    private Type _contextTypeInfo;

    private CultureInfo _neutralResourcesCulture;


    public SingleAssemblyComponentResourceManager(Type t)

        : base(t)

    {

        _contextTypeInfo = t;

    }


    protected override ResourceSet InternalGetResourceSet(CultureInfo culture, 

        bool createIfNotExists, bool tryParents)

    {

        ResourceSet rs = (ResourceSet)this.ResourceSets[culture];

        if (rs == null)

        {

            Stream store = null;

            string resourceFileName = null;


            //lazy-load default language (without caring about duplicate assignment in race conditions, no harm done);

            if (this._neutralResourcesCulture == null)

            {

                this._neutralResourcesCulture = 

                    GetNeutralResourcesLanguage(this.MainAssembly);

            }


            // if we're asking for the default language, then ask for the

            // invariant (non-specific) resources.

            if (_neutralResourcesCulture.Equals(culture))

                culture = CultureInfo.InvariantCulture;

            resourceFileName = GetResourceFileName(culture);


            store = this.MainAssembly.GetManifestResourceStream(

                this._contextTypeInfo, resourceFileName);


            //If we found the appropriate resources in the local assembly

            if (store != null)

            {

                rs = new ResourceSet(store);

                //save for later.

                AddResourceSet(this.ResourceSets, culture, ref rs);

            }

            else

            {

                rs = base.InternalGetResourceSet(culture, createIfNotExists, tryParents);

            }

        }

        return rs;

    }


    //private method in framework, had to be re-specified here.

    private static void AddResourceSet(Hashtable localResourceSets, 

        CultureInfo culture, ref ResourceSet rs)

    {

        lock (localResourceSets)

        {

            ResourceSet objA = (ResourceSet)localResourceSets[culture];

            if (objA != null)

            {

                if (!object.Equals(objA, rs))

                {

                    rs.Dispose();

                    rs = objA;

                }

            }

            else

            {

                localResourceSets.Add(culture, rs);

            }

        }

    }

}

要實際使用此類,您需要在Visual Studio創(chuàng)建的“ XXX.Designer.cs”文件中替換System.ComponentModel.ComponentResourceManager-并且每次更改設(shè)計表單時都需要執(zhí)行此操作-Visual Studio會替換該類自動編碼。(該問題在“ 自定義Windows窗體設(shè)計器以使用MyResourceManager ”中進行了討論,但沒有找到更優(yōu)雅的解決方案-我在預(yù)構(gòu)建步驟中使用fart.exe來自動替換。)


查看完整回答
反對 回復(fù) 2019-11-26
?
米脂

TA貢獻1836條經(jīng)驗 獲得超3個贊

另一個快速說明-使用ILMerge困擾我的一件事是它是附加的專有Microsoft工具,默認情況下未隨Visual Studio一起安裝,因此存在額外的依賴關(guān)系,這使得第三方上手有點困難與我的開源項目。


我最近發(fā)現(xiàn)了ILRepack,它是一種等效于開源(Apache 2.0)的工具,到目前為止,它對我也可以正常工作(直接替換),并且可以隨項目源自由分發(fā)。


我希望這可以幫助某個人!


查看完整回答
反對 回復(fù) 2019-11-26
  • 3 回答
  • 0 關(guān)注
  • 519 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號