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

标签 c# .net json json.net com-interop

我将 Netwonsoft.Json 库的“嵌入互操作类型”属性设置为 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/

关于c# - Json.Net 可以嵌入到可执行文件中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39736077/

相关文章:

c# - WP7 : take screenshot from application

c# - 使用 C# 制作自解压可执行文件

c# - 如何在 Visual Studio for OSX 上搭建项目基架

c# - .net 中的 PNG 压缩

.net - 如何创建带有标签和值的 Winforms 组合框?

c# - SQL 中适合 C# 类型 TimeSpan 的类型是什么

.net - 如何在 VS2010 中创建混合托管/ native C++ dll?

json - swift ,错误: ambiguous use of subscript

JSON单值解析

json - 我怎样才能让 jq 按字母顺序漂亮地打印 json 排序键