Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用库的app.manifest文件而不是调用项目_C#_.net_Com_Manifest - Fatal编程技术网

C# 如何使用库的app.manifest文件而不是调用项目

C# 如何使用库的app.manifest文件而不是调用项目,c#,.net,com,manifest,C#,.net,Com,Manifest,我有以下代码: public static void Init() { Type myClassAdapterType = Type.GetTypeFromProgID("DotNetAdapter.Adapter"); object myClassAdapterInstance = Activator.CreateInstance(myClassAdapterType); IAdapter myClassAdapter = (IA

我有以下代码:

    public static void Init()
    {
        Type myClassAdapterType = Type.GetTypeFromProgID("DotNetAdapter.Adapter");
        object myClassAdapterInstance = Activator.CreateInstance(myClassAdapterType);
        IAdapter myClassAdapter = (IAdapter)myClassAdapterInstance;
        DWAdapter = myClassAdapter;
    }
此方法是库的一部分,它帮助我通过.NET2库中的COM互操作访问.NET4库

我基于本教程:

可在此处查看代码:

在他的示例中,您可以看到控制台应用程序如何使用app.manifest通过COM互操作访问.Net 4库,从而实现无注册操作。 在我的版本中,我用.NET2.0库替换了控制台应用程序

为了测试库,我只创建了一个Init方法,该方法由.NET2.0控制台应用程序调用。控制台应用程序没有app.manifest文件,库没有

我的问题是第一行返回空值。因此
myClassAdapterType
为null,因为
Type.GetTypeFromProgID(“DotNetAdapter.Adapter”)
返回null

该行应该能够通过访问app.manifest文件检索类型。但问题就在这里。与不读取包含该方法的库的清单不同,VS似乎尝试读取调用控制台应用程序的(不存在的)清单文件

(TLDR)我的问题: 是否有方法更改myClassAdapterType=Type.GetTypeFromProgID(“DotNetAdapter.Adapter”)以便访问库的app.manifest。或者有没有办法告诉VS使用文件夹x中的app.manifest


PS:如果我将库外的清单添加到调用控制台应用程序中,它会工作,但我不允许在这里使用清单文件

我终于从一位同事那里得到了一个答案,我想与大家分享一下,以防有人犯了与我同样的错误

答案是实际上不可能在库中使用清单。让我困惑的是,用于通过COM互操作进行通信的适配器库是一个包含正在使用的清单的库。我不知道的是,这是因为使用了COM。正在承载库并使用清单。 否则,清单是库项目的一部分,但不会被使用


我不知道我是否正确地解释了这一点,但我希望它能有所帮助。

你完全错了。需要清单才能找到DLL。将清单放入DLL会给Windows带来鸡和蛋的问题,它找不到DLL,因此也找不到清单。它必须包含在控制台模式应用程序中。如果您“不允许”这样做,那么您当然对清单没有任何用处。当前它是这样工作的:当前它是这样工作的:我有一个DotNet2ConsoleApp,它通过正常引用来使用DotNet2Library。DotNet2库需要一个DotNet4库才能工作。为此,DotNet2Library使用app.manifest定义对DotNet4Library的依赖关系。这就是DotNet2Library使用app.manifest文件的原因。DotNet2ConsoleApp不需要app.manifest,因为DotNet2Library通常在DotNet2ConsoleApp的项目中被引用。我是一个初学者,所以我可能实际上做得根本不对。如果是,请解释并感谢您的回复!这不是清单,您指的是用于配置CLR的app.exe.config配置文件。是,不工作,因为CLR在存储EXE文件的目录中查找。如果不允许复制该目录中的文件,则必须在GAC中注册DLL。始终是[ComVisible]代码的正确解决方案,以避免DLL地狱。如果我通过VS by Add>Application manifest添加它们,我不理解它为什么不是清单。我不能使用注册表,这就是我使用清单方法的原因。如果您有时间,请查看我的原始帖子中的第二个链接,它包含示例的源代码,并提供了更多信息。我只想用.Net 2.0库替换作为控制台应用程序的Net2Assembly。