gpt4 book ai didi

c# - CLR 探查器 : issue in using DefineAssemblyRef

转载 作者:IT王子 更新时间:2023-10-29 04:45:08 29 4
gpt4 key购买 nike

我想编写一个 CLR 探查器来将我们的应用程序函数与 GetILFunctionBody/SetILFunctionBody Hook 。

我想使用 DefineAssemblyRef 导入我们的 c# dll(用于 IL 代码)在这段代码中,DefineAssemblyRef 总是返回 True?我的 dll 必须签名吗?是否需要安装在全局程序集缓存 (GAC) 中?

     HRESULT CProfilerCallback::JITCompilationStarted
(
UINT functionId,
BOOL fIsSafeToBlock
)
{
ClassID classID;
ModuleID moduleID;
mdToken token;
wchar_t wszClass[512];
wchar_t wszMethod[512];
HRESULT result = S_OK;
ClassID classId = 0;
ModuleID moduleId = 0;
mdToken tkMethod = 0;

// Get the moduleID and tkMethod
m_pICorProfilerInfo->GetFunctionInfo(functionId, &classId, &moduleId, &tkMethod);

if(!GetMethodNameFromFunctionId(functionId,wszClass,wszMethod))
{return S_FALSE;}


if(wcscmp(wszMethod,L"FunctionName") == 0)
{
// Get the metadata import
IMetaDataImport* pMetaDataImport = NULL;
DebugBreak();
result = m_pICorProfilerInfo->GetModuleMetaData
(
moduleId,
ofRead,
IID_IMetaDataImport,
(IUnknown** )&pMetaDataImport
);


if (FAILED(result))
{ return S_FALSE;}
//
// Metadata modification
//
IMetaDataEmit* pMetaDataEmit = NULL;
IMetaDataAssemblyEmit* pMetaDataAssemblyEmit = NULL;
mdAssemblyRef tkLoggerLib;
HRESULT res;
res = m_pICorProfilerInfo->GetModuleMetaData
(
moduleId, /// The ID of the module to which the interface instance will be mapped
ofRead | ofWrite,
IID_IMetaDataEmit,
(IUnknown** )&pMetaDataEmit
);

if (FAILED(res)) {DebugBreak(); return S_FALSE;} /// DebugBreak for debug

res = pMetaDataEmit->QueryInterface
(
IID_IMetaDataAssemblyEmit,
(void**)&pMetaDataAssemblyEmit
);

if (FAILED(res)) { return S_FALSE;}

// Get the token for the Logger class and its Log method
mdTypeDef tkLogger = 0;
mdMethodDef tkLog = 0;

// Create a token for the Log.dll assembly
ASSEMBLYMETADATA amd;
ZeroMemory(&amd, sizeof(amd));
amd.usMajorVersion = 0;
amd.usMinorVersion = 0;
amd.usBuildNumber = 0;
amd.usRevisionNumber = 0;

res= pMetaDataAssemblyEmit->DefineAssemblyRef
(
NULL, 0, // No public key token
L"Dllname", ///dll name
&amd, NULL, 0, 0,
&tkLoggerLib
);

if (FAILED(res)) {return S_FALSE; }

......

最佳答案

根据此 MSDN 博客 http://blogs.msdn.com/b/davbr/archive/2006/02/27/540280.aspx :

IMetaDataAssemblyEmit::DefineAssemblyRef() 为您的程序集提供一个 mdAssemblyRef。 要做到这一点,需要做一些工作。引用您的程序集的可靠方法是签署您的程序集,将其添加到 GAC,并使用“gacutil/l”为您打印出的公钥

您还可以找到有用的这个项目 - CLR 动态 Hook 注入(inject) http://www.dupuis.me/node/18那种演示你正在尝试做什么。

关于c# - CLR 探查器 : issue in using DefineAssemblyRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6859881/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com