uia 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .idea/
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ruby-uia.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Levi Wilson
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Uia
2
+
3
+ The `Uia` gem is a low-level driver for interacting with Microsoft UIA elements in a Windows environment.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'uia'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install uia
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/ext/.gitignore ADDED
@@ -0,0 +1,151 @@
1
+ ## Ignore Visual Studio temporary files, build results, and
2
+ ## files generated by popular Visual Studio add-ons.
3
+
4
+ # User-specific files
5
+ *.suo
6
+ *.user
7
+ *.sln.docstates
8
+
9
+ # Build results
10
+
11
+ [Dd]ebug/
12
+ [Rr]elease/
13
+ x64/
14
+ build/
15
+ [Bb]in/
16
+ [Oo]bj/
17
+
18
+ # Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
19
+ !packages/*/build/
20
+
21
+ # MSTest test Results
22
+ [Tt]est[Rr]esult*/
23
+ [Bb]uild[Ll]og.*
24
+
25
+ *_i.c
26
+ *_p.c
27
+ *.ilk
28
+ *.meta
29
+ *.obj
30
+ *.pch
31
+ *.pdb
32
+ *.pgc
33
+ *.pgd
34
+ *.rsp
35
+ *.sbr
36
+ *.tlb
37
+ *.tli
38
+ *.tlh
39
+ *.tmp
40
+ *.tmp_proj
41
+ *.log
42
+ *.vspscc
43
+ *.vssscc
44
+ .builds
45
+ *.pidb
46
+ *.log
47
+ *.scc
48
+
49
+ # Visual C++ cache files
50
+ ipch/
51
+ *.aps
52
+ *.ncb
53
+ *.opensdf
54
+ *.sdf
55
+ *.cachefile
56
+
57
+ # Visual Studio profiler
58
+ *.psess
59
+ *.vsp
60
+ *.vspx
61
+
62
+ # Guidance Automation Toolkit
63
+ *.gpState
64
+
65
+ # ReSharper is a .NET coding add-in
66
+ _ReSharper*/
67
+ *.[Rr]e[Ss]harper
68
+
69
+ # TeamCity is a build add-in
70
+ _TeamCity*
71
+
72
+ # DotCover is a Code Coverage Tool
73
+ *.dotCover
74
+
75
+ # NCrunch
76
+ *.ncrunch*
77
+ .*crunch*.local.xml
78
+
79
+ # Installshield output folder
80
+ [Ee]xpress/
81
+
82
+ # DocProject is a documentation generator add-in
83
+ DocProject/buildhelp/
84
+ DocProject/Help/*.HxT
85
+ DocProject/Help/*.HxC
86
+ DocProject/Help/*.hhc
87
+ DocProject/Help/*.hhk
88
+ DocProject/Help/*.hhp
89
+ DocProject/Help/Html2
90
+ DocProject/Help/html
91
+
92
+ # Click-Once directory
93
+ publish/
94
+
95
+ # Publish Web Output
96
+ *.Publish.xml
97
+ *.pubxml
98
+
99
+ # NuGet Packages Directory
100
+ ## TODO: If you have NuGet Package Restore enabled, uncomment the next line
101
+ #packages/
102
+
103
+ # Windows Azure Build Output
104
+ csx
105
+ *.build.csdef
106
+
107
+ # Windows Store app package directory
108
+ AppPackages/
109
+
110
+ # Others
111
+ sql/
112
+ *.Cache
113
+ ClientBin/
114
+ [Ss]tyle[Cc]op.*
115
+ ~$*
116
+ *~
117
+ *.dbmdl
118
+ *.[Pp]ublish.xml
119
+ *.pfx
120
+ *.publishsettings
121
+
122
+ # RIA/Silverlight projects
123
+ Generated_Code/
124
+
125
+ # Backup & report files from converting an old project file to a newer
126
+ # Visual Studio version. Backup files are not needed, because we have git ;-)
127
+ _UpgradeReport_Files/
128
+ Backup*/
129
+ UpgradeLog*.XML
130
+ UpgradeLog*.htm
131
+
132
+ # SQL Server files
133
+ App_Data/*.mdf
134
+ App_Data/*.ldf
135
+
136
+ # =========================
137
+ # Windows detritus
138
+ # =========================
139
+
140
+ # Windows image file caches
141
+ Thumbs.db
142
+ ehthumbs.db
143
+
144
+ # Folder config file
145
+ Desktop.ini
146
+
147
+ # Recycle Bin used on file shares
148
+ $RECYCLE.BIN/
149
+
150
+ # Mac crap
151
+ .DS_Store
Binary file
Binary file
@@ -0,0 +1,24 @@
1
+ using System;
2
+ using System.Windows.Automation;
3
+
4
+ namespace UIA.Helper
5
+ {
6
+ public class AutomationProperty
7
+ {
8
+ public enum Id
9
+ {
10
+ IsSelectionItem = 0,
11
+ }
12
+
13
+ public static PropertyCondition From(Id id)
14
+ {
15
+ switch (id)
16
+ {
17
+ case Id.IsSelectionItem:
18
+ return new PropertyCondition(AutomationElement.IsSelectionItemPatternAvailableProperty, true);
19
+ default:
20
+ throw new ArgumentException(id + " is not a supported property");
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,34 @@
1
+ using System;
2
+ using System.Runtime.InteropServices;
3
+ using System.Windows.Automation;
4
+ using System.Windows.Forms;
5
+
6
+ namespace UIA.Helper
7
+ {
8
+ public class Clicker
9
+ {
10
+ [DllImport("user32.dll")]
11
+ static extern void mouse_event(uint flags, uint x, uint y, uint data, int extraInfo);
12
+
13
+ [Flags]
14
+ public enum MouseEvent
15
+ {
16
+ Leftdown = 0x00000002,
17
+ Leftup = 0x00000004,
18
+ }
19
+
20
+ private const uint MOUSEEVENTLF_LEFTDOWN = 0x2;
21
+ private const uint MOUSEEVENTLF_LEFTUP = 0x4;
22
+
23
+ public static void MouseClick(AutomationElement element)
24
+ {
25
+ element.ScrollToIfPossible();
26
+ element.SetFocus();
27
+
28
+ var clickablePoint = element.GetClickablePoint();
29
+ Cursor.Position = new System.Drawing.Point((int)clickablePoint.X, (int)clickablePoint.Y);
30
+ mouse_event(MOUSEEVENTLF_LEFTDOWN, 0, 0, 0, 0);
31
+ mouse_event(MOUSEEVENTLF_LEFTUP, 0, 0, 0, 0);
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,87 @@
1
+ using System;
2
+ using System.Linq;
3
+ using System.Windows.Automation;
4
+
5
+ namespace UIA.Helper
6
+ {
7
+ public class Element
8
+ {
9
+ private readonly AutomationElement _element;
10
+
11
+ private Element(AutomationElement element)
12
+ {
13
+ _element = element;
14
+ }
15
+
16
+ public int[] RuntimeId
17
+ {
18
+ get { return _element.GetRuntimeId(); }
19
+ }
20
+
21
+ public string Name
22
+ {
23
+ get { return _element.Current.Name; }
24
+ }
25
+
26
+ public int NativeWindowHandle
27
+ {
28
+ get { return _element.Current.NativeWindowHandle; }
29
+ }
30
+
31
+ public Element[] Children
32
+ {
33
+ get
34
+ {
35
+ return _element.FindAll(TreeScope.Children, Condition.TrueCondition).Cast<AutomationElement>()
36
+ .Select(x => new Element(x))
37
+ .ToArray();
38
+ }
39
+ }
40
+
41
+ public Element[] ChildrenOf(AutomationProperty.Id id)
42
+ {
43
+ return _element.FindAll(TreeScope.Children, AutomationProperty.From(id)).Cast<AutomationElement>()
44
+ .Select(x => new Element(x))
45
+ .ToArray();
46
+ }
47
+
48
+ public void MouseClick()
49
+ {
50
+ Clicker.MouseClick(_element);
51
+ }
52
+
53
+ public static Element ById(string automationId)
54
+ {
55
+ var foundElement = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));
56
+ if (null == foundElement)
57
+ {
58
+ throw new ArgumentException(string.Format("An element with the id \"{0}\" was not found", automationId));
59
+ }
60
+
61
+ return new Element(foundElement);
62
+ }
63
+
64
+ public static Element ByHandle(IntPtr windowHandle)
65
+ {
66
+ var foundElement = AutomationElement.FromHandle(windowHandle);
67
+ if (null == foundElement)
68
+ {
69
+ throw new ArgumentException(string.Format("An element with the handle 0x{0:x} was not found", windowHandle.ToInt32()));
70
+ }
71
+
72
+ return new Element(foundElement);
73
+ }
74
+
75
+ public static Element ByRuntimeId(int[] runtimeId)
76
+ {
77
+ var foundElement = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.RuntimeIdProperty, runtimeId));
78
+ if (null == foundElement)
79
+ {
80
+ throw new ArgumentException(string.Format("An element with the runtime id \"{0}\" was not found",
81
+ string.Join(", ", runtimeId.Select(x => x.ToString()))));
82
+ }
83
+
84
+ return new Element(foundElement);
85
+ }
86
+ }
87
+ }
@@ -0,0 +1,74 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.Linq;
4
+ using System.Threading;
5
+ using System.Windows;
6
+ using System.Windows.Automation;
7
+
8
+ namespace UIA.Helper
9
+ {
10
+ public static class Extensions
11
+ {
12
+ public static string Join<T>(this IEnumerable<T> items, string separator = ", ")
13
+ {
14
+ return string.Join(separator, items.Select(x => x.ToString()));
15
+ }
16
+ }
17
+
18
+ public static class ElementExtensions
19
+ {
20
+
21
+ public static bool ScrollToIfPossible(this AutomationElement automationElement)
22
+ {
23
+ if (!automationElement.CanScrollTo())
24
+ {
25
+ return false;
26
+ }
27
+
28
+ if (!automationElement.HasClickablePoint())
29
+ {
30
+ automationElement.AsScrollItem().ScrollIntoView();
31
+ automationElement.WaitUntilClickable(3);
32
+ }
33
+
34
+ return true;
35
+ }
36
+
37
+
38
+ public static bool CanScrollTo(this AutomationElement automationElement)
39
+ {
40
+ return (bool)automationElement.GetCurrentPropertyValue(AutomationElement.IsScrollItemPatternAvailableProperty);
41
+ }
42
+
43
+
44
+ public static bool HasClickablePoint(this AutomationElement automationElement)
45
+ {
46
+ Point point;
47
+ return automationElement.TryGetClickablePoint(out point);
48
+ }
49
+
50
+
51
+ public static void WaitUntilClickable(this AutomationElement automationElement, int howManySeconds)
52
+ {
53
+ var then = DateTime.Now;
54
+ while (!automationElement.HasClickablePoint())
55
+ {
56
+ Thread.Sleep(1);
57
+ if ((DateTime.Now - then).Seconds > howManySeconds)
58
+ {
59
+ throw new Exception(string.Format("Waited for more than {0} seconds to be able to click this", howManySeconds));
60
+ }
61
+ }
62
+ }
63
+
64
+ public static ScrollItemPattern AsScrollItem(this AutomationElement automationElement)
65
+ {
66
+ return automationElement.As<ScrollItemPattern>(ScrollItemPatternIdentifiers.Pattern);
67
+ }
68
+
69
+ public static T As<T>(this AutomationElement automationElement, AutomationPattern pattern)
70
+ {
71
+ return (T)automationElement.GetCurrentPattern(pattern);
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,36 @@
1
+ using System.Reflection;
2
+ using System.Runtime.CompilerServices;
3
+ using System.Runtime.InteropServices;
4
+
5
+ // General Information about an assembly is controlled through the following
6
+ // set of attributes. Change these attribute values to modify the information
7
+ // associated with an assembly.
8
+ [assembly: AssemblyTitle("UIA.Helper")]
9
+ [assembly: AssemblyDescription("")]
10
+ [assembly: AssemblyConfiguration("")]
11
+ [assembly: AssemblyCompany("")]
12
+ [assembly: AssemblyProduct("UIA.Helper")]
13
+ [assembly: AssemblyCopyright("Copyright © 2013")]
14
+ [assembly: AssemblyTrademark("")]
15
+ [assembly: AssemblyCulture("")]
16
+
17
+ // Setting ComVisible to false makes the types in this assembly not visible
18
+ // to COM components. If you need to access a type in this assembly from
19
+ // COM, set the ComVisible attribute to true on that type.
20
+ [assembly: ComVisible(false)]
21
+
22
+ // The following GUID is for the ID of the typelib if this project is exposed to COM
23
+ [assembly: Guid("a2579041-e1cd-4916-9d8a-dd96d91ed966")]
24
+
25
+ // Version information for an assembly consists of the following four values:
26
+ //
27
+ // Major Version
28
+ // Minor Version
29
+ // Build Number
30
+ // Revision
31
+ //
32
+ // You can specify all the values or you can default the Build and Revision Numbers
33
+ // by using the '*' as shown below:
34
+ // [assembly: AssemblyVersion("1.0.*")]
35
+ [assembly: AssemblyVersion("1.0.0.0")]
36
+ [assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,62 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
4
+ <PropertyGroup>
5
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
6
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
7
+ <ProjectGuid>{C2D567A8-B059-41A8-B9F5-FF4F8F961C1F}</ProjectGuid>
8
+ <OutputType>Library</OutputType>
9
+ <AppDesignerFolder>Properties</AppDesignerFolder>
10
+ <RootNamespace>UIA.Helper</RootNamespace>
11
+ <AssemblyName>UIA.Helper</AssemblyName>
12
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
13
+ <FileAlignment>512</FileAlignment>
14
+ <TargetFrameworkProfile />
15
+ </PropertyGroup>
16
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
17
+ <DebugSymbols>true</DebugSymbols>
18
+ <DebugType>full</DebugType>
19
+ <Optimize>false</Optimize>
20
+ <OutputPath>bin\Debug\</OutputPath>
21
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
22
+ <ErrorReport>prompt</ErrorReport>
23
+ <WarningLevel>4</WarningLevel>
24
+ </PropertyGroup>
25
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
26
+ <DebugType>pdbonly</DebugType>
27
+ <Optimize>true</Optimize>
28
+ <OutputPath>bin\Release\</OutputPath>
29
+ <DefineConstants>TRACE</DefineConstants>
30
+ <ErrorReport>prompt</ErrorReport>
31
+ <WarningLevel>4</WarningLevel>
32
+ </PropertyGroup>
33
+ <ItemGroup>
34
+ <Reference Include="System" />
35
+ <Reference Include="System.Core" />
36
+ <Reference Include="System.Drawing" />
37
+ <Reference Include="System.Windows.Forms" />
38
+ <Reference Include="System.Xml.Linq" />
39
+ <Reference Include="System.Data.DataSetExtensions" />
40
+ <Reference Include="Microsoft.CSharp" />
41
+ <Reference Include="System.Data" />
42
+ <Reference Include="System.Xml" />
43
+ <Reference Include="UIAutomationClient" />
44
+ <Reference Include="UIAutomationTypes" />
45
+ <Reference Include="WindowsBase" />
46
+ </ItemGroup>
47
+ <ItemGroup>
48
+ <Compile Include="AutomationProperty.cs" />
49
+ <Compile Include="Clicker.cs" />
50
+ <Compile Include="Element.cs" />
51
+ <Compile Include="Extensions.cs" />
52
+ <Compile Include="Properties\AssemblyInfo.cs" />
53
+ </ItemGroup>
54
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
55
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
56
+ Other similar extension points exist, see Microsoft.Common.targets.
57
+ <Target Name="BeforeBuild">
58
+ </Target>
59
+ <Target Name="AfterBuild">
60
+ </Target>
61
+ -->
62
+ </Project>
@@ -0,0 +1,22 @@
1
+ #include "stdafx.h"
2
+ #include "ArrayHelper.h"
3
+
4
+ array<int>^ ArrayHelper::ToArray(const int items[], const int length) {
5
+ auto managedItems = gcnew array<int>(length);
6
+ for(auto index = 0; index < length; ++index) {
7
+ managedItems[index] = items[index];
8
+ }
9
+ return managedItems;
10
+ }
11
+
12
+
13
+ int* ArrayHelper::FromArray(array<int>^ items) {
14
+ auto unmanagedArray = new int[items->Length];
15
+
16
+ auto index = 0;
17
+ for each(auto item in items) {
18
+ unmanagedArray[index++] = item;
19
+ }
20
+
21
+ return unmanagedArray;
22
+ }
@@ -0,0 +1,8 @@
1
+ #pragma once
2
+ ref class ArrayHelper
3
+ {
4
+ public:
5
+ static array<int>^ ToArray(const int items[], const int length);
6
+ static int* FromArray(array<int>^ items);
7
+ };
8
+
@@ -0,0 +1,40 @@
1
+ #include "stdafx.h"
2
+
3
+ using namespace System;
4
+ using namespace System::Reflection;
5
+ using namespace System::Runtime::CompilerServices;
6
+ using namespace System::Runtime::InteropServices;
7
+ using namespace System::Security::Permissions;
8
+
9
+ //
10
+ // General Information about an assembly is controlled through the following
11
+ // set of attributes. Change these attribute values to modify the information
12
+ // associated with an assembly.
13
+ //
14
+ [assembly:AssemblyTitleAttribute("UiaDll")];
15
+ [assembly:AssemblyDescriptionAttribute("")];
16
+ [assembly:AssemblyConfigurationAttribute("")];
17
+ [assembly:AssemblyCompanyAttribute("")];
18
+ [assembly:AssemblyProductAttribute("UiaDll")];
19
+ [assembly:AssemblyCopyrightAttribute("Copyright (c) 2013")];
20
+ [assembly:AssemblyTrademarkAttribute("")];
21
+ [assembly:AssemblyCultureAttribute("")];
22
+
23
+ //
24
+ // Version information for an assembly consists of the following four values:
25
+ //
26
+ // Major Version
27
+ // Minor Version
28
+ // Build Number
29
+ // Revision
30
+ //
31
+ // You can specify all the value or you can default the Revision and Build Numbers
32
+ // by using the '*' as shown below:
33
+
34
+ [assembly:AssemblyVersionAttribute("1.0.*")];
35
+
36
+ [assembly:ComVisible(false)];
37
+
38
+ [assembly:CLSCompliantAttribute(true)];
39
+
40
+ [assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
@@ -0,0 +1,24 @@
1
+ #include "StdAfx.h"
2
+ #include "DynamicAssemblyResolver.h"
3
+
4
+ void DynamicAssemblyResolver::PrivatePath::set(String^ path) {
5
+ _PrivatePath = path;
6
+ AppDomain::CurrentDomain->AssemblyResolve += gcnew ResolveEventHandler(Resolve);
7
+ }
8
+
9
+ Assembly^ DynamicAssemblyResolver::Resolve(Object^ sender, ResolveEventArgs^ args)
10
+ {
11
+ try
12
+ {
13
+ auto fullPrivatePath = Path::Combine(_PrivatePath, AssemblyFromQualifiedName(args->Name));
14
+ return Assembly::LoadFrom(fullPrivatePath);
15
+ }
16
+ catch(...) { }
17
+
18
+ return nullptr;
19
+ }
20
+
21
+ String^ DynamicAssemblyResolver::AssemblyFromQualifiedName(String^ qualifiedName)
22
+ {
23
+ return qualifiedName->Substring(0, qualifiedName->IndexOf(",")) + ".dll";
24
+ }
@@ -0,0 +1,16 @@
1
+ #pragma once
2
+ using namespace System::IO;
3
+ using namespace System::Reflection;
4
+
5
+ ref class DynamicAssemblyResolver
6
+ {
7
+ public:
8
+ static property String^ PrivatePath {
9
+ void set(String^ value);
10
+ }
11
+
12
+ private:
13
+ static String^ _PrivatePath = nullptr;
14
+ static Assembly^ Resolve(Object^ sender, ResolveEventArgs^ args);
15
+ static String^ AssemblyFromQualifiedName(String^ qualifiedName);
16
+ };