标签: .net-assembly

替换或修改外部应用程序中的 API 调用(GetOpenFileName、GetSaveFileName)

我有一个旧的应用程序,它调用 GetOpenFileNameA 和 GetSaveFileNameA。两个调用都是错误的。应用程序崩溃了!我使用 OllyDbg 和 API Monitor 来读取 OPENFILENAME 结构中存储的大小。该结构的大小为 76 字节(使用 Windows 7 x64 进行测试)。调用 GetOpenFileNameA 或 GetSaveFileNameA 时出现访问冲突异常。我假设在运行时 Windows 尝试读取 88 字节而不是 76 字节。看看这个: http: //dotnetbutchering.blogspot.de/2007/10/vc-60-getting-0xc0000005-access.html 和这个 http://www.asmcommunity.net/board/index.php?topic =5768.15

我做了一些研究,同时我发现了以下行为:运行 Microsoft Spy++ 时,应用程序不会崩溃!我单步执行调试器,发现访问冲突异常仍然发生,但不知何故,异常被吞没了。该应用程序运行良好!我可以加载和保存文件。

我有以下想法。你觉得他们怎么样?

  1. 写某事。就像 Loader.exe 一样,它的作用与 Spy++ 相同。调用两个 API 时吞掉访问冲突异常。

  2. 使用 DLL 注入和 API 挂钩。我可以将 GetOpenFileName 和 GetSaveFileName 与自定义 DLL 中的自定义实现挂钩。我的实现将修复该结构并将更正后的结构传递给原始 API 调用。

  3. 使用 SetWindowsHook 挂钩窗口消息?!?!?!

  4. 修补二进制文件。是否可以通过使用十六进制编辑器修补来解决此结构大小问题?

哪一个有效?您有更好的主意我该如何解决这个问题吗?

我无法获取这个旧应用程序的源代码。我必须使用现有的二进制文件来修复它。我的解决方案必须至少在 Windows XP 和 Windows 7(x86、x64)上运行

PEiD 工具向我显示了有关旧应用程序的以下信息:链接器信息:2.55 MS Visual C++ 4.0

c++ crash hook winapi .net-assembly

5
推荐指数
1
解决办法
1461
查看次数

ILMerge 程序集未正确合并

我正在使用 ILMerge 版本 2.11.1103.0 将 4 个 DLL 合并到一个新程序集中。假设他们分别称为A、B、C、D,那么他们的关系如下:

B -> A
C -> A
D -> A
D -> C
Run Code Online (Sandbox Code Playgroud)

当我在 A、B 和 C 上运行 ILMerge 时,一切都运行得很好。但是当我添加 DI 时收到以下错误:

An exception occurred during merging:
ILMerge.Merge: The assembly 'A' was not merged in correctly.
It is still listed as an external reference in the target assembly.
   at ILMerging.ILMerge.Merge()
   at ILMerging.ILMerge.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)

我已尝试使用 /close 选项,如此处所示ILMerge DLL: Assembly not merged in正确,仍列为外部引用,但不幸的是它没有帮助:

In order to close the target assembly, the number …
Run Code Online (Sandbox Code Playgroud)

c# ilmerge build-process build .net-assembly

5
推荐指数
1
解决办法
7251
查看次数

卸载AppDomain后删除dll文件

我目前正在尝试制作一个游戏引擎,尝试逐个复制统一功能,用于加载一些脚本,我没有问题,但是当我必须重新加载它们时,单声道编译失败,告诉我DLL是已经访问过,或者无法删除DLL文件。

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics;
using System.Security.Policy;
using System.Security;
using System.Security.Permissions;

public class Proxy : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            byte[] response = new System.Net.WebClient().DownloadData(assemblyPath);
            return Assembly.ReflectionOnlyLoad(response);
        }
        catch (Exception)
        {
            return null;
        }
    }

    public Assembly GetAssembly2(string assemblyPath, AppDomain domain)
    {
        try
        {
            byte[] bytesDLL = new System.Net.WebClient().DownloadData(assemblyPath);
            return domain.Load(bytesDLL);
        }
        catch (Exception)
        {
            return null;
            // throw …
Run Code Online (Sandbox Code Playgroud)

c# dll mono appdomain .net-assembly

5
推荐指数
1
解决办法
3066
查看次数

无法加载文件或程序集“Microsoft.SqlServer.Types,Version=12.0.0.0,Culture=neutral,PublicKeyToken=myKey”或其依赖项之一。

使用 SQL SERVER 2012 版运行 ASP.NET C# 应用程序后,我收到以下错误消息:

本地报告处理期间发生错误。报告“C:\inetpub\wwwroot\psla\Reports\PD Listing Report - Per ED.rdlc”的定义无效。报表处理中发生意外错误。无法加载文件或程序集“Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)

可能是什么原因?我试过在网上搜索,并且有对 version=11.0.0.0 的引用,但没有对 version=12.0.0.0 的“Microsoft.SqlServer.Types”的引用。查看visual studio 2015的参考管理器,我只能找到版本= 11.0.0.0。

.net c# sql-server asp.net .net-assembly

5
推荐指数
1
解决办法
1万
查看次数

如何识别“参考程序集”?

许多 .NET 程序集附带一个仅参考版本,该版本去除了实际代码,只有元数据。

例如,我可以在我的机器上的多个位置找到 System.Core.dll,其中两个是:

  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Core.dll 大小:276 KB
  • C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll 大小:1291 KB

第一个只有元数据,在默认加载上下文中加载它会引发 BadImageFormat 异常。

System.BadImageFormatException:无法加载文件或程序集“System.Core,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089”或其依赖项之一。不应为执行加载引用程序集。它们只能在仅反射加载器上下文中加载

给定程序集的路径,是否可以确定它是否是“参考程序集”?

我可以检查关键字“参考程序集”的路径,但是如果程序集被复制到不同的位置,这很麻烦,并且不起作用。如果有帮助,我可以自由地首先在仅反射上下文中加载程序集。

.net c# dll .net-assembly

5
推荐指数
1
解决办法
1675
查看次数

C# 输出程序集文件名 (csproj)

通过 VS 构建时,有什么方法可以更改输出程序集文件名?

我有两个(四个,包括 Debug/Release 分支)配置,它们的功能有点不同,应该以不同的方式使用,但应该保持在同一个目录中。因此,最好的是 ProjectName.dll 和 ProjectName.Test.dll。

请不要建议更改 AssemblyName 参数(我通过谷歌搜索 SO 看到的唯一提示),它们不一样。AssemblyName 还会更改每个类的完整类名,这是不希望的。我想改变只有文件名和内保持任何组件unthouched。

现在我已经通过将 AfterBuild 目标添加到 .csproj 中来完成此操作,该 .csproj 使用重命名复制程序集,但我不喜欢这个解决方案。可以更容易吗?

还尝试将 OutputPath 设置为 SomeWhere\ProjectName.Test.dll - 它只是创建目录 ProjectName.Test.dll 并将 $(AssemblyName).dll 放在那里。

UPD:更清晰的解释,为什么 AssemblyName 更改不是我想要的。AssemblyName 也是程序集中每个类型的一部分(它指向程序集,类型来自哪里),它直接应用于类型解析。例如,我为 ISome 接口引用了 ProgName.dll。解析器尝试查找 ProgName(在类型的元数据中设置)但什么也没找到,因为没有 ProgName,只有 ProgName.Test。当它们都具有 AssemblyName ProgName(不是 .Test)时,它将起作用。当然,如果我处理不同的文件名。

UPD2:更好地解释我在谈到 AssemblyName 时的意思: 解析器数据截图 红色标记的是程序集解析器试图找到的内容。我的两个配置中的程序集具有相同的接口,因此客户不必关心他需要找到什么程序集。两者都应该具有相同的 AssemblyName,但不同的文件名(存储在同一文件夹中)。

我使用 ILRepack 将多个程序集合并为一个:

  • dll
  • B.dll(或 B.Test.dll,取决于配置)
  • dll

A 和 C 都引用了 B.dll。如果我改为合并 B.Test.dll(使用 AssemblyName“B.Test”),则引用将保持引用。如果我合并 B.dll,则不会保留任何引用(里面的所有代码)。所以我需要 B.Test.dll(使用这个文件名)来拥有 AssemblyName“B”。

c# csproj .net-assembly visual-studio

5
推荐指数
1
解决办法
7048
查看次数

将输出引用程序集构建到子文件夹

背景

我的程序集(一个 DLL)正在被第三方应用程序加载,我无法控制它是如何加载的。第三方应用程序将加载给定目录中的所有程序集。

问题

如果我的程序集和另一个程序集使用相同的库,但版本不同,它们将位于同一目录中并且会发生冲突。我已经研究了<probing>配置文件指令和程序集解析器,所以我知道如何创建一个子目录并让我的程序集搜索它的引用。

需要

我需要某种配置visual studio 的方法来将我的主DLL 构建到根文件夹中,并将所有引用构建到一个子文件夹中。最好在构建期间(因为我将构建配置为直接转到正确的文件夹。

.net c# build .net-assembly visual-studio

5
推荐指数
1
解决办法
4024
查看次数

尽管添加了绑定重定向,但仍无法加载文件或程序集

调用 Web API 时出现以下错误:

Could not load file or assembly 'Microsoft.CommonSchema.Services, Version=4.1.0.0, Culture=neutral,
PublicKeyToken=872fbc9102191257' or one of its dependencies. The located assembly's manifest definition does not match
the assembly reference. (Exception from HRESULT: 0x80131040)
Run Code Online (Sandbox Code Playgroud)

尽管在 web.config 中有这个:

<dependentAssembly>
    <assemblyIdentity name="Microsoft.CommonSchema.Services" publicKeyToken="872fbc9102191257" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
  </dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

我不确定我在这里做错了什么。我的packages.config 中有4.2.0.0 版本,上面的绑定不应该处理我遇到的错误吗?

c# asp.net reference .net-assembly

5
推荐指数
1
解决办法
444
查看次数

.NET 检测 - 对自定义程序集的函数调用失败 - Azure Web 应用

我已经通过 Visual Studio 2012 将我的 .NET 检测分析器部署到 Azure webapps 中。我的分析器执行字节码检测,如下所示,

FunctionA()
{
   --> Injected C# function Call 
   functionA's body
   -->Injected C# function Call
}
Run Code Online (Sandbox Code Playgroud)

注入的函数调用驻留在单独的程序集 dll 上。在物理框中,程序集将添加到 GAC 中。但在 Azure 中,它将出现在 web 应用程序位置的文件夹中,该文件夹将在 web.config 文件中进行探测。

使用 IMetaDataAssemblyEmit 的 DefineAssemblyRef,我定义了程序集及其在加载到进程中的每个模块中的功能。该问题是注入的函数调用仅适用于Web应用程序模块的功能..!System.Web.dll 或 System.Data.dll 等其他模块无法调用该函数,这导致 Azure Web 应用程序无法加载并出现 502 错误。

很快,注入到 Web 应用程序以外的模块中就失败了。我猜这是加载自定义程序集时的安全问题,我也尝试设置[assembly: System.Security.AllowPartiallyTrustedCallers]PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]其他一些安全属性.. 没有帮助.. 如何使这个帮助程序集由 .Net 模块加载。?我是否需要为程序集设置任何其他特定的安全属性才能加载..?

profiler azure .net-assembly azure-web-app-service clr-profiling-api

5
推荐指数
0
解决办法
121
查看次数

.NET Core - 在集成测试中获取父程序集名称

我有使用Microsoft.AspNetCore.TestHost包托管在内存中的集成测试项目。然后我有用于这些测试的库。我想我的库中获取测试项目的 程序集名称。所以结构看起来像这样。

TestHost --> TestProject --> MyLibrary
Run Code Online (Sandbox Code Playgroud)

我所做的是尝试调用以下方法:

Assembly.GetExecutingAssembly() 返回 MyLibrary 程序集

Assembly.GetCallingAssembly() 返回 MyLibrary 程序集

Assembly.GetEntryAssembly() 返回 TestHost 程序集。

通过将程序集从 TestProject 传递到 MyLibrary ,有什么方法可以在不明确指定的情况下获得它?

编辑

正如@svoychik 所建议的那样,我也尝试Assembly.GetCallingAssembly()直接从调用的方法中TestProject调用,MyLibrary但这会返回:

System.Private.CoreLib,版本=4.0.0.0,文化=中性,

c# .net-assembly .net-core

5
推荐指数
1
解决办法
609
查看次数