ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 可以将Json.Net嵌入到可执行文件中吗?

2019-06-23 04:55:03  阅读:223  来源: 互联网

标签:json c net json-net com-interop


我将Netwonsoft.Json库的’Embed Interop Types’属性设置为true,并返回错误:

Cannot embed interop types from assembly
'c:\path\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll'
because it is missing either the 'ImportedFromTypeLibAttribute' attribute or
the 'PrimaryInteropAssemblyAttribute' attribute
c:\path\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll

它看起来像在Newtonsoft.Json库中寻找缺少的引用,但我不完全确定.是否有可能将Json.Net嵌入到可执行文件中?

解决方法:

你没有说你正在使用哪种语言,但这里是你如何为C#做的

首先,关闭“嵌入互操作类型”

然后,到主可执行项目,卸载并编辑.csproj文件,并在以下行下面:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

将此XML添加到项目文件中,保存并重新加载.

 <Target Name="AfterResolveReferences">
  <ItemGroup>
    <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
      <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
</Target>

然后,您将向主项目添加一个新的代码文件,并向其添加以下代码(修改为适合您的应用程序的命名/结构化方式,在WPF应用程序中,放置它的好地方是App.xaml.cs ):

[STAThread]
public static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;

    App.Main(); // Run WPF startup code.
}

private static Assembly OnResolveAssembly(object sender, ResolveEventArgs e)
{
    var thisAssembly = Assembly.GetExecutingAssembly();

    // Get the Name of the AssemblyFile
    var assemblyName = new AssemblyName(e.Name);
    var dllName = assemblyName.Name + ".dll";

    // Load from Embedded Resources - This function is not called if the Assembly is already
    // in the same folder as the app.
    var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(dllName));
    if (resources.Any())
    {

        // 99% of cases will only have one matching item, but if you don't,
        // you will have to change the logic to handle those cases.
        var resourceName = resources.First();
        using (var stream = thisAssembly.GetManifestResourceStream(resourceName))
        {
            if (stream == null) return null;
            var block = new byte[stream.Length];

            // Safely try to load the assembly.
            try
            {
                stream.Read(block, 0, block.Length);
                return Assembly.Load(block);
            }
            catch (IOException)
            {
                return null;
            }
            catch(BadImageFormatException)
            {
                return null;
            }
        }
    }

    // in the case the resource doesn't exist, return null.
    return null;
}

最后,确保将主应用程序的目标方法更新为刚刚添加的项目的主要方法

资料来源:http://www.paulrohde.com/merging-a-wpf-application-into-a-single-exe/

标签:json,c,net,json-net,com-interop
来源: https://codeday.me/bug/20190623/1267462.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有