This isn't actually a change in behavior.  If you try to install the
SSCLI version of an assembly in the .NET Framework GAC I think you'll
have the same results.

This issue is generally described in sscli\docs\relnotes.html in the
first section, SSCLI assembly keys, although this particular situation
isn't covered.

The problem is due to the way the ECMA key is handled as a special case
(System.Windows.Forms.dll is signed with the ECMA key even though it's
not in the standard). In the .NET Framework, assemblies with this key
are actually signed with the Microsoft private key.  In SSCLI since we
can't ship the Microsoft private key, ECMA assemblies are signed with
the Rotor key.

What this means is that because the SSCLI thinks that *only* the Rotor
public key is a valid substitute for the ECMA key, it will not allow
.NET Framework assemblies to be installed in the GAC.  I had initially
thought that you could turn off key verification (sn -Vr) for these
assemblies but you can only turn off verification for assemblies that
are partially signed (public key and not signed) but not for fully
signed assemblies that don't contain what's considered a valid signature
(created with either the private key that matches the public key or the
one, wired-in, special private key that's a substitute for the ECMA
private key which doesn't exist) so I don't believe there's a way to
easily do this.

You can view source that does the key substitution in
sscli\clr\src\dlls\mscorsn\strongname.cpp.  Search for "ECMA" or
"neutral" or "Rotor".

The source for the gacutil tool is in sscli\clr\src\tools\gac\gac.cpp.

John

This posting is provided "AS IS" with no warranties, and confers no
rights.


-----Original Message-----
From: Donal Lafferty [mailto:[EMAIL PROTECTED]] 
Sent: Tuesday, August 13, 2002 1:52 PM
To: [EMAIL PROTECTED]
Subject: gacutil.exe


While playing around with gacutil.exe, I noticed a difference in
behaviour between the commercial and the rotor version.  With the
commercial version, and a standard Command Prompt, this works:

C:\GACtest>gacutil /i System.Windows.Forms.dll

Microsoft (R) .NET Global Assembly Cache Utility.  Version 1.0.3705.0
Copyright (C) Microsoft Corporation 1998-2001. All rights reserved.

Assembly successfully added to the cache

C:\GACtest>


Note that the GACTest folder contains System.Windows.Forms.dll.

With the Rotor version, and a checked-build environment, the same
command does not work:


Microsoft (R) Shared Source CLI Global Assembly Cache Utility.  Version
1.0.0002.0 Copyright (C) Microsoft Corporation 1998-2002. All rights
reserved.

Failure adding assembly to the cache: Strong name signature could not be
verified.  Was the assembly built delay-signed?


C:\GACtest>


At first I thought it might be because System.Windows.Forms was a multi-
module assembly.  However, I think I've copied all the referenced DLLs
into the GACtest folder and still get the same result.  Besides, the
files I added to the directory were already in the Command Prompt
shell's PATH setting.

Can anyone suggest a good reference for gacutil.exe, or explain what's
going on?

Thanks a bunch,


DL

Reply via email to