[5/5] fusion: Add support for installing version 4.0 assemblies.
Hans Leidekker
hans at codeweavers.com
Mon May 21 04:26:07 CDT 2012
Fixes http://bugs.winehq.org/show_bug.cgi?id=30707
---
dlls/fusion/asmcache.c | 45 +++++++++++++++++++++++++++------------------
1 file changed, 27 insertions(+), 18 deletions(-)
diff --git a/dlls/fusion/asmcache.c b/dlls/fusion/asmcache.c
index fdf8ab5..93047d4 100644
--- a/dlls/fusion/asmcache.c
+++ b/dlls/fusion/asmcache.c
@@ -94,39 +94,48 @@ static BOOL create_full_path(LPCWSTR path)
return ret;
}
-static BOOL get_assembly_directory(LPWSTR dir, DWORD size, PEKIND architecture)
+static BOOL get_assembly_directory(LPWSTR dir, DWORD size, const char *version, PEKIND architecture)
{
+ static const WCHAR dotnet[] = {'\\','M','i','c','r','o','s','o','f','t','.','N','E','T','\\',0};
static const WCHAR gac[] = {'\\','a','s','s','e','m','b','l','y','\\','G','A','C',0};
-
static const WCHAR msil[] = {'_','M','S','I','L',0};
static const WCHAR x86[] = {'_','3','2',0};
static const WCHAR amd64[] = {'_','6','4',0};
+ DWORD len = GetWindowsDirectoryW(dir, size);
- GetWindowsDirectoryW(dir, size);
- strcatW(dir, gac);
-
+ if (!strcmp(version, "v4.0.30319"))
+ {
+ strcpyW(dir + len, dotnet);
+ len += sizeof(dotnet)/sizeof(WCHAR) -1;
+ strcpyW(dir + len, gac + 1);
+ len += sizeof(gac)/sizeof(WCHAR) - 2;
+ }
+ else
+ {
+ strcpyW(dir + len, gac);
+ len += sizeof(gac)/sizeof(WCHAR) - 1;
+ }
switch (architecture)
{
case peNone:
break;
case peMSIL:
- strcatW(dir, msil);
+ strcpyW(dir + len, msil);
break;
case peI386:
- strcatW(dir, x86);
+ strcpyW(dir + len, x86);
break;
case peAMD64:
- strcatW(dir, amd64);
+ strcpyW(dir + len, amd64);
break;
default:
WARN("unhandled architecture %u\n", architecture);
return FALSE;
}
-
return TRUE;
}
@@ -371,15 +380,11 @@ static HRESULT WINAPI IAssemblyCacheImpl_InstallAssembly(IAssemblyCache *iface,
static const WCHAR ext_dll[] = {'.','d','l','l',0};
IAssemblyCacheImpl *cache = impl_from_IAssemblyCache(iface);
ASSEMBLY *assembly;
- LPWSTR filename;
- LPWSTR name = NULL;
- LPWSTR token = NULL;
- LPWSTR version = NULL;
- LPWSTR asmpath = NULL;
- WCHAR path[MAX_PATH];
- WCHAR asmdir[MAX_PATH];
- LPWSTR ext;
+ WCHAR *filename, *ext;
+ WCHAR *name = NULL, *token = NULL, *version = NULL, *asmpath = NULL;
+ WCHAR path[MAX_PATH], asmdir[MAX_PATH];
PEKIND architecture;
+ char *clr_version;
HRESULT hr;
TRACE("(%p, %d, %s, %p)\n", iface, dwFlags,
@@ -416,10 +421,14 @@ static HRESULT WINAPI IAssemblyCacheImpl_InstallAssembly(IAssemblyCache *iface,
if (FAILED(hr))
goto done;
+ hr = assembly_get_runtime_version(assembly, &clr_version);
+ if (FAILED(hr))
+ goto done;
+
cache_lock( cache );
architecture = assembly_get_architecture(assembly);
- get_assembly_directory(asmdir, MAX_PATH, architecture);
+ get_assembly_directory(asmdir, MAX_PATH, clr_version, architecture);
sprintfW(path, format, asmdir, name, version, token);
--
1.7.10
More information about the wine-patches
mailing list