Delphi:如何调用.Net 4.0版的strongNameSignatureReferenceEx
我正在尝试从Delphi(使用Rad Studio Berlin)调用Delphi:如何调用.Net 4.0版的strongNameSignatureReferenceEx,.net,delphi,interop,jedi,jedi-code-library,.net,Delphi,Interop,Jedi,Jedi Code Library,我正在尝试从Delphi(使用Rad Studio Berlin)调用IClrStrongName上的strongNameSignatureReferenceEx 我的第一次尝试只是使用了定义 function StrongNameSignatureVerificationEx( wszFilePath : LPCWSTR; fForceVerification : boolean; var pfWasVerifided : boolean ): BOOL; stdcall; ext
IClrStrongName
上的strongNameSignatureReferenceEx
我的第一次尝试只是使用了定义
function StrongNameSignatureVerificationEx(
wszFilePath : LPCWSTR;
fForceVerification : boolean;
var pfWasVerifided : boolean
): BOOL; stdcall; external 'mscoree.dll';
但是这调用了.Net 2.0版本(目标计算机不需要该版本,它给出了一个很好的“请安装.Net framework 2.0/3.5消息”)
有一种机制可以创建CLR主机,并使用TJclClrHost
var
anHost : TJclClrHost;
aClsId : TGUID;
res : Boolean;
obj : OleVariant; // ? Not sure about this, copying from another example
begin
anHost := TJclClrHost.Create('v4.0.30319');
anHost. Start
aClsId := StringToGuid('{9280188d-0e8e-4867-b30c-7fa83884e8de}');
res := anHost.GetInterface(aClsId, obj);
//...
但是,我没有iclrsstrongname
的Delphi定义,所以一旦我得到了对象,我就不知道如何调用它上的任何方法。导入McSea.TLB不给出一个,而WebSturk只从中向我显示C++定义。
最简单的方法是创建一个导出所需功能的.net类库。一些方法可以做到这一点:
external
指令将其函数导入Delphi
<> P>有大量的例子说明如何在Web上同时完成这两个问题,这里有堆栈溢出,所以我不会尝试创建更多相同的例子。< /P>“4.我如何将C++定义转换成Delphi?”——最好的是,用手。读取C++定义并转换为相应的Delphi类型和构造。拉扎勒斯也有h2pas util,绝地Win API库中也有一些东西。但是它们可能被破坏或过时,调试它们的输出,你必须能够理解C++和Delphi构造的底层的表示,这使得你能够手动地转换它们,回到原来的一个。@ Arioch,我害怕…但这听起来很像工作:)这是我清单上的下一个问题,但我想我会先发布一个问题,只是有可能有一个更快的方法,或者其他人已经做过:?那就是学习一次低级(汇编级)表示,然后它就没有那么多了,然后翻译将是微不足道的,如果单调乏味的话(但是一个单一的方法翻译太少了,不能称之为乏味的工作)。或者你可以记住模式,但如果你的记忆失败,你将无法在Delphi调试CPU窗口中发现问题。COM的一个例子(但不是.Net)接口转换——在绝地Windows API库中应该有更多的例子,我们将对此进行检查,感谢在我的JCL版本中,JclDotNEt单元中没有GetInterface方法。这意味着这一切都是过去3年的最新开发。这意味着您使用的是一个前沿代码,除了开发人员之外,很少有人有任何经验。这意味着,你最好在那里搜索JCL开发者论坛并征求意见。恐怕我们已经有了C#程序集,我们正在从Delphi访问该程序集。问题是该程序集将被一个假的程序集所取代(说来话长,这里没有关系),因此我正在使用上述调用(以及其他调用)从Delphi到检查C#汇编的命名和签名。创建一个新的汇编来检查第一个汇编的安全性只会将问题向后推一步。我恐怕不太确定第一点的意思,但我感觉这涉及到在混合中添加另一种语言,这可能比我希望的要多做。怎样才能阻止伪造者,伪造
IClrStrongName
?或者替换你的可执行文件?你肯定可以信任一些东西吗?@Arioch'这对我来说毫无意义。如果没有代码可以信任,那么整个练习就毫无意义。如果一些代码可以信任,就把类库放在受信任的区域。没关系。我们似乎在讨论构造问题中不存在的INT。我认为“希望”在讨论安全性时,我真的不想看到这个词。我觉得很可疑!强名称不是一种安全功能。它们是避免DLL地狱的一种手段。你可能给自己一种错误的安全感。尽管从你的评论字里行间读到,你已经知道这一点,而且是被上级强迫这样做的我不会听你的!