C# 如何使用ICLRStrongName::strongNameSignatureReferenceEx方法标识延迟签名的程序集

C# 如何使用ICLRStrongName::strongNameSignatureReferenceEx方法标识延迟签名的程序集,c#,.net,.net-assembly,C#,.net,.net Assembly,任何人都可以建议如何使用ICLRStrongName::strongNameSignatureReferenceEx方法来识别延迟签名的程序集。我在网上找不到任何例子。我不明白如何使用这种方法 请不要向我推荐任何链接,我几乎对网络上不同的建议和链接感到失望。任何人都可以提供相同的代码示例。我也遇到了同样的问题,最终找到了时间进行调查。我真的不明白为什么微软没有花时间写一份足够的文档 下面的链接非常有用,还包含一个示例项目,即使它也不能回答所有问题: 我将尝试用简短的代码示例回答所有问题。您可以使

任何人都可以建议如何使用ICLRStrongName::strongNameSignatureReferenceEx方法来识别延迟签名的程序集。我在网上找不到任何例子。我不明白如何使用这种方法


请不要向我推荐任何链接,我几乎对网络上不同的建议和链接感到失望。任何人都可以提供相同的代码示例。

我也遇到了同样的问题,最终找到了时间进行调查。我真的不明白为什么微软没有花时间写一份足够的文档

下面的链接非常有用,还包含一个示例项目,即使它也不能回答所有问题:

我将尝试用简短的代码示例回答所有问题。您可以使用类似以下内容来验证程序集的强名称:

public bool VerifyStrongName(string assemblyPath, bool force)
{
  if (string.IsNullOrEmpty(assemblyPath))
    throw new ArgumentException(string.Empty, "assemblyPath");

  var host = HostingInteropHelper.GetClrMetaHost<IClrMetaHost>();

  var bufferSize = 100;
  var version = new StringBuilder(bufferSize);
  var result = host.GetVersionFromFile(Assembly.GetExecutingAssembly().Location, version, ref bufferSize);
  if ((HResult)result != HResult.S_OK)
    throw new COMException("Error", result);

  IClrRuntimeInfo info = host.GetRuntime(version.ToString(), new Guid(IID.IClrRuntimeInfo)) as IClrRuntimeInfo;
  ICLRStrongName sn = info.GetInterface(new Guid(CLSID.ClrStrongName), new Guid(IID.IClrStrongName)) as ICLRStrongName;

  var verResult = sn.StrongNameSignatureVerificationEx(assemblyPath, Convert.ToByte(force));
  return Convert.ToBoolean(verResult);
}

我希望我能帮助你。如果您还有其他问题,请毫不犹豫地提问。

我在下面的行中看到一条红色的曲线:var host=HostingInteropHelper.GetClrMetaHost();。我不明白如何从我的方法调用静态calss方法。我已将我的代码发布在:。你能给我建议一下解决办法吗?因为这对我来说很紧急。我的最终目标是为延迟签名程序集返回TRUE。解决方案中的第一个问题是,HostingInteropHelper类没有标记为public(这也是错误消息所告诉的)。将其标记为public,您将不会遇到此问题。接下来,如果您使用所有我的代码,那么您只能使用我的代码(用上面的我的枚举替换静态类HResult,否则您将无法强制转换结果)。您还需要包括静态类CLSID和IID(见上文),或者只粘贴相应的guid。此外,您还忘记了一些使用指令(System.Reflection和System.Runtime.InteropServices)。现在应该可以了。谢谢你的帮助。除了下面的错误,我似乎已经差不多完成了。Program.cs(8,33):错误CS0234:名称空间“Microsoft.Runtime.Hosting”中不存在类型或名称空间名称“Interop”(是否缺少程序集引用?),很遗憾,我不知道如何使用Interop,也无法在网络中获得适当的资源。请求您在这方面帮助我。看起来这是CLR激活程序集中包含的命名空间的一部分。你提到这两个项目了吗?当我测试它时,在应用上面提到的更改之后,没有更多的错误。如果这没有帮助,只需上传您当前的解决方案,我就可以为您检查。Hi-tY Software,很抱歉回复太晚。我正忙着,不能集中精力做这项工作。我已将我的代码上载到以下URL。若要重现此错误,请使用VS命令提示符编译Program.cs文件:csc Program.cs我收到以下错误:Program.cs(8,33):错误CS0234:命名空间“Microsoft.Runtime.Hosting”中不存在类型或命名空间名称“Interop”(是否缺少程序集引用?)
  /// <summary>
  /// A set of common, useful HRESULTS, and related functionality
  /// </summary>
  public enum HResult
  {
    /// <summary>
    /// OK/true/Success
    /// </summary>
    S_OK = 0,
    /// <summary>
    /// False
    /// </summary>
    S_FALSE = 1,
    /// <summary>
    /// The method is not implemented
    /// </summary>
    E_NOTIMPL = unchecked((int)0x80004001),
    /// <summary>
    /// The interface is not supported
    /// </summary>
    E_NOINTERFACE = unchecked((int)0x80004002),
    /// <summary>
    /// Bad Pointer
    /// </summary>
    E_POINTER = unchecked((int)0x8004003),
    /// <summary>
    /// General failure HRESULT
    /// </summary>
    E_FAIL = unchecked((int)0x8004005),
    /// <summary>
    /// Invalid Argument
    /// </summary>
    E_INVALIDARG = unchecked((int)0x80070057),
    /// <summary>
    /// Insufficient buffer
    /// </summary>
    ERROR_INSUFFICIENT_BUFFER = unchecked((int)0x8007007A),
    /// <summary>
    /// HRESULT for failure to find or load an appropriate runtime
    /// </summary>
    CLR_E_SHIM_RUNTIMELOAD = unchecked((int)0x80131700),

    SEVERITY = unchecked((int)0x80000000)
  }
  public static class IID
  {
    public const string IClrRuntimeInfo = "BD39D1D2-BA2F-486A-89B0-B4B0CB466891";
    public const string IClrMetaHost = "D332DB9E-B9B3-4125-8207-A14884F53216";
    public const string IClrStrongName = "9FD93CCF-3280-4391-B3A9-96E1CDE77C8D";
    public const string IEnumUnknown = "00000100-0000-0000-C000-000000000046";
  }

  public static class CLSID
  {
    public const string ClrStrongName = "B79B0ACD-F5CD-409b-B5A5-A16244610B92";
  }