21
21
mlogger = get_logger (__name__ )
22
22
23
23
24
+ # C:\Windows\Microsoft.NET\Framework\
25
+
24
26
if not EXEC_PARAMS .doc_mode :
25
27
INTERFACE_TYPES_DIR = op .join (LOADER_DIR , 'basetypes' )
26
28
29
+ DOTNET_DIR = op .join (os .getenv ('windir' ), 'Microsoft.NET' ,'Framework' )
30
+
27
31
DOTNET_SDK_DIR = op .join (os .getenv ('programfiles(x86)' ),
28
32
'Reference Assemblies' ,
29
33
'Microsoft' , 'Framework' , '.NETFramework' )
30
34
35
+
36
+ try :
37
+ # get sorted list of installed frawework paths
38
+ DOTNET_FRAMEWORK_DIRS = sorted (
39
+ [x for x in os .listdir (DOTNET_DIR )
40
+ if x .startswith ('v4.' ) and 'X' not in x ], reverse = True )
41
+ except Exception as dotnet_fw_err :
42
+ DOTNET_FRAMEWORK_DIRS = []
43
+ mlogger .debug ('Dotnet Frawework is not installed. | %s' , dotnet_fw_err )
44
+
31
45
try :
46
+ # get sorted list of installed frawework sdk paths
32
47
DOTNET_TARGETPACK_DIRS = sorted (
33
48
[x for x in os .listdir (DOTNET_SDK_DIR )
34
49
if x .startswith ('v4.' ) and 'X' not in x ], reverse = True )
35
50
except Exception as dotnet_sdk_err :
36
51
DOTNET_TARGETPACK_DIRS = []
37
52
mlogger .debug ('Dotnet SDK is not installed. | %s' , dotnet_sdk_err )
38
53
else :
39
- INTERFACE_TYPES_DIR = DOTNET_SDK_DIR = DOTNET_TARGETPACK_DIRS = None
54
+ DOTNET_DIR = INTERFACE_TYPES_DIR = DOTNET_SDK_DIR = \
55
+ DOTNET_FRAMEWORK_DIRS = DOTNET_TARGETPACK_DIRS = None
40
56
41
57
42
58
# base classes for pyRevit commands --------------------------------------------
67
83
# get and load the active Cpython engine
68
84
CPYTHON_ENGINE = user_config .get_active_cpython_engine ()
69
85
CPYTHON_ENGINE_ASSM = CPYTHON_ENGINE .AssemblyPath
86
+ mlogger .debug ('Loading cpython engine: %s' , CPYTHON_ENGINE_ASSM )
70
87
load_asm_file (CPYTHON_ENGINE_ASSM )
71
88
72
89
# create a hash for the loader assembly
@@ -125,41 +142,75 @@ def _get_resource_file(resource_name):
125
142
126
143
127
144
def _get_framework_module (fw_module ):
145
+ # start with the newest sdk folder and
146
+ # work backwards trying to find the dll
147
+ for fw_folder in DOTNET_FRAMEWORK_DIRS :
148
+ fw_module_file = op .join (DOTNET_DIR ,
149
+ fw_folder ,
150
+ make_canonical_name (fw_module ,
151
+ ASSEMBLY_FILE_TYPE ))
152
+ mlogger .debug ('Searching for installed: %s' , fw_module_file )
153
+ if op .exists (fw_module_file ):
154
+ mlogger .debug ('Found installed: %s' , fw_module_file )
155
+ sys .path .append (op .join (DOTNET_DIR , fw_folder ))
156
+ return fw_module_file
157
+
158
+ return None
159
+
160
+
161
+ def _get_framework_sdk_module (fw_module ):
128
162
# start with the newest sdk folder and
129
163
# work backwards trying to find the dll
130
164
for sdk_folder in DOTNET_TARGETPACK_DIRS :
131
165
fw_module_file = op .join (DOTNET_SDK_DIR ,
132
166
sdk_folder ,
133
167
make_canonical_name (fw_module ,
134
168
ASSEMBLY_FILE_TYPE ))
169
+ mlogger .debug ('Searching for sdk: %s' , fw_module_file )
135
170
if op .exists (fw_module_file ):
171
+ mlogger .debug ('Found sdk: %s' , fw_module_file )
136
172
sys .path .append (op .join (DOTNET_SDK_DIR , sdk_folder ))
137
173
return fw_module_file
138
174
139
175
return None
140
176
141
177
142
178
def _get_reference_file (ref_name ):
179
+ mlogger .debug ('Searching for dependency: %s' , ref_name )
143
180
# First try to find the dll in the project folder
144
181
addin_file = framework .get_dll_file (ref_name )
145
182
if addin_file :
146
183
load_asm_file (addin_file )
147
184
return addin_file
148
185
186
+ mlogger .debug ('Dependency is not shipped: %s' , ref_name )
187
+ mlogger .debug ('Searching for dependency in loaded assemblies: %s' , ref_name )
149
188
# Lastly try to find location of assembly if already loaded
150
189
loaded_asm = find_loaded_asm (ref_name )
151
190
if loaded_asm :
152
191
return loaded_asm [0 ].Location
153
192
154
- # Then try to find the dll in windows SDK
155
- if DOTNET_TARGETPACK_DIRS :
193
+ mlogger .debug ('Dependency is not loaded: %s' , ref_name )
194
+ mlogger .debug ('Searching for dependency in installed frameworks: %s' ,
195
+ ref_name )
196
+ # Then try to find the dll in windows installed framework files
197
+ if DOTNET_DIR :
156
198
fw_module_file = _get_framework_module (ref_name )
157
199
if fw_module_file :
158
200
return fw_module_file
159
201
202
+
203
+ mlogger .debug ('Dependency is not installed: %s' , ref_name )
204
+ mlogger .debug ('Searching for dependency in installed frameworks sdks: %s' ,
205
+ ref_name )
206
+ # Then try to find the dll in windows SDK
207
+ if DOTNET_TARGETPACK_DIRS :
208
+ fw_sdk_module_file = _get_framework_sdk_module (ref_name )
209
+ if fw_sdk_module_file :
210
+ return fw_sdk_module_file
211
+
160
212
# if not worked raise critical error
161
- mlogger .critical ('Can not find required reference assembly: %s' ,
162
- ref_name )
213
+ mlogger .critical ('Can not find required reference assembly: %s' , ref_name )
163
214
164
215
165
216
def _get_references ():
@@ -177,8 +228,7 @@ def _get_references():
177
228
178
229
refs = [_get_reference_file (ref_name ) for ref_name in ref_list ]
179
230
180
- # add cpython engine dll to references
181
- # _get_reference_file('engines/372/Python.Runtime')
231
+ # add cpython engine assembly
182
232
refs .append (CPYTHON_ENGINE_ASSM )
183
233
184
234
return refs
0 commit comments