Dreamine.PLC.Mitsubishi.MxComponent 1.0.1
Dreamine.PLC.Mitsubishi.MxComponent 산업 자동화 및 I/O 기능을 제공합니다.
로딩중...
검색중...
일치하는것 없음
DefaultComObjectFactory.cs
이 파일의 문서화 페이지로 가기
1using System.Reflection;
2
4
14{
63 public object Create(string progId)
64 {
65 if (!OperatingSystem.IsWindows())
66 {
67 throw new PlatformNotSupportedException("MX Component COM controls are supported on Windows only.");
68 }
69
70 if (string.IsNullOrWhiteSpace(progId))
71 {
72 throw new ArgumentException("COM ProgID must not be empty.", nameof(progId));
73 }
74
75 if (Environment.Is64BitProcess && progId.Equals("ActUtlType.ActUtlType", StringComparison.OrdinalIgnoreCase))
76 {
77 progId = "ActUtlType64.ActUtlWrap";
78 }
79
80 if (Environment.Is64BitProcess && progId.StartsWith("ActUtlType64.", StringComparison.OrdinalIgnoreCase))
81 {
83 }
84
85 Type? type;
86 try
87 {
88 type = Type.GetTypeFromProgID(progId, throwOnError: false);
89 }
90 catch (Exception ex)
91 {
92 throw CreateFriendlyException(progId, ex);
93 }
94
95 if (type is null)
96 {
97 throw CreateFriendlyException(progId);
98 }
99
100 try
101 {
102 return Activator.CreateInstance(type)
103 ?? throw new InvalidOperationException($"Failed to create MX Component COM object: {progId}");
104 }
105 catch (Exception ex)
106 {
107 throw CreateFriendlyException(progId, ex);
108 }
109 }
110
151 private static object CreateDotUtlType64Wrapper()
152 {
153 var assemblyPath = FindDotUtlType64AssemblyPath();
154 if (assemblyPath is null)
155 {
156 throw new InvalidOperationException(
157 "MX Component 64-bit wrapper assembly was not found. Expected DotUtlType64.dll under the MELSOFT ACT Control Wrapper folder.");
158 }
159
160 var assembly = Assembly.LoadFrom(assemblyPath);
161 var type = assembly.GetType("DotUtlType64.DotUtlType64", throwOnError: false)
162 ?? throw new InvalidOperationException($"DotUtlType64.DotUtlType64 type was not found in {assemblyPath}.");
163
164 return Activator.CreateInstance(type)
165 ?? throw new InvalidOperationException($"Failed to create DotUtlType64.DotUtlType64 from {assemblyPath}.");
166 }
167
184 private static string? FindDotUtlType64AssemblyPath()
185 {
186 var candidates = new[]
187 {
188 Path.Combine(
189 Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
190 "MELSOFT",
191 "ACT",
192 "Control",
193 "Wrapper",
194 "DotUtlType64.dll"),
195 Path.Combine(
196 Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
197 "MELSOFT",
198 "ACT",
199 "Control",
200 "DotUtlType64.dll")
201 };
202
203 return candidates.FirstOrDefault(File.Exists);
204 }
205
238 private static InvalidOperationException CreateFriendlyException(string progId, Exception? innerException = null)
239 {
240 var bitness = Environment.Is64BitProcess ? "x64" : "x86";
241 return new InvalidOperationException(
242 $"MX Component COM '{progId}' is not registered for the current {bitness} process. " +
243 "For a 64-bit process, try ProgID 'ActUtlType64.ActUtlWrap'. For a 32-bit process, try 'ActUtlType.ActUtlType'. " +
244 "Check MX Component Communication Setup Utility and confirm the Logical Station Number.",
245 innerException);
246 }
247}
static InvalidOperationException CreateFriendlyException(string progId, Exception? innerException=null)