[c#] क्यों मैं विधानसभा को करने में असमर्थ हूँ। WinMD फ़ाइलों का लोड?



Answers

Question

मैं किसी विधि को लिखने की कोशिश कर रहा हूं, सी # से असेंबली / WinMD फ़ाइल से सभी नामस्थान प्राप्त करें I किसी कारण के लिए, मुझे WinMD फ़ाइलों के लिए ऐसा करने में परेशानी हो रही है क्योंकि मैं उन्हें लोड करने में असमर्थ हूं यहाँ मेरा भाग प्रासंगिक भाग है ( Winmds पर प्रतिबिंबित करने के बारे में इस उत्तर से आंशिक रूप से चोरी हो गया है):

using System;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices.WindowsRuntime;

public static class Load
{
    public static Assembly AssemblyFrom(string path)
    {
        var domain = AppDomain.CurrentDomain;
        ResolveEventHandler assemblyHandler = (o, e) => Assembly.ReflectionOnlyLoad(e.Name);
        EventHandler<NamespaceResolveEventArgs> namespaceHandler = (o, e) =>
        {
            string file = WindowsRuntimeMetadata
                .ResolveNamespace(e.NamespaceName, Array.Empty<string>())
                .FirstOrDefault();

            if (file == null)
                return;

            var assembly = Assembly.ReflectionOnlyLoadFrom(file);
            e.ResolvedAssemblies.Add(assembly);
        };

        try
        {
            // Load it! (plain .NET assemblies)
            return Assembly.LoadFrom(path);
        }
        catch
        {
            try
            {
                // Hook up the handlers
                domain.ReflectionOnlyAssemblyResolve += assemblyHandler;
                WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve += namespaceHandler;

                // Load it again! (WinMD components)
                return Assembly.ReflectionOnlyLoadFrom(path);
            }
            finally
            {
                // Detach the handlers
                domain.ReflectionOnlyAssemblyResolve -= assemblyHandler;
                WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve -= namespaceHandler;
            }
        }
    }
}

किसी कारण के लिए, ऐसा लगता है कि winmd फ़ाइलें विफल हो रही हैं, दोनों के लिए नियमित और प्रतिबिंब केवल असेंबली लोड मैं कोशिश कर रहा हूँ जब मैं एक Assembly.LoadFrom को करने की कोशिश करता हूं। Assembly.LoadFrom करें उस पर से मुझे एक अपवाद मिलता है कि यह समर्थित नहीं है (जो उम्मीद की जानी चाहिए )। तब, जब मैं प्रतिबिंब-केवल विधि की कोशिश करता हूं, मुझे एक और अपवाद मिलता है (विशेष रूप से, ReflectionTypeLoadException अपवाद)। जब मैं इसे catch हूं और फिर LoaderExceptions संपत्ति को प्रिंट करता LoaderExceptions , जैसे:

try
{
    // Add the handlers

    return Assembly.ReflectionOnlyLoadFrom(path);
}
catch (ReflectionTypeLoadException e)
{
    foreach (var inner in e.LoaderExceptions)
        Console.WriteLine(inner);
}
finally
{
    // Remove the handlers
}

मुझे इस तरह कंसोल में एक त्रुटि गुच्छा की पूरी गुच्छा मिलती है:

मैंने जो भी हैंडलर ( assemblyHandler और namespaceHandler ) को शामिल नहीं किया है, या तो कहा जा रहा है; जब मैं Console.WriteLines को जोड़ता हूं। उन्हें Console.WriteLines , मैं स्क्रीन पर कुछ भी उत्पादन नहीं देखता हूं।

क्या कोई मुझे बता सकता है कि ऐसा क्यों हो रहा है और इसे कैसे तय किया जाए? किसी भी मदद की बहुत सराहना की जाएगी, क्योंकि मैं 2 दिनों के लिए इस पर मेरे सिर की पीट कर रहा हूं।

संपादित करें: मैंने यहां एक GitHub सार के रूप में उपलब्ध पूर्ण आउटपुट बनाया है

2 संपादित करें: यदि आपके पास विंडोज 10 देव उपकरण स्थापित है, तो आप इस पर विधि को चलाने का प्रयास कर सकते हैं

C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\2.0.0.0\Windows.Foundation.UniversalApiContract.winmd

एक repro प्राप्त करने के लिए




Links