public void SharedCodeService_Methods() { string projectPath = null; string outputPath = null; TestHelper.GetProjectPaths("", out projectPath, out outputPath); string clientProjectPath = CodeGenHelper.ClientClassLibProjectPath(projectPath); ConsoleLogger logger = new ConsoleLogger(); using (SharedCodeService sts = CodeGenHelper.CreateSharedCodeService(clientProjectPath, logger)) { CodeMemberShareKind shareKind = sts.GetMethodShareKind(typeof(TestValidator).AssemblyQualifiedName, "IsValid", new string[] { typeof(TestEntity).AssemblyQualifiedName, typeof(ValidationContext).AssemblyQualifiedName }); Assert.AreEqual(CodeMemberShareKind.SharedByReference, shareKind, "Expected TestValidator.IsValid to be shared by reference"); shareKind = sts.GetMethodShareKind(typeof(TestEntity).AssemblyQualifiedName, "ServerAndClientMethod", Array.Empty <string>()); Assert.AreEqual(CodeMemberShareKind.SharedByReference, shareKind, "Expected TestValidator.ServerAndClientMethod to be shared by reference"); shareKind = sts.GetMethodShareKind(typeof(TestEntity).AssemblyQualifiedName, "ServerMethod", Array.Empty <string>()); Assert.AreEqual(CodeMemberShareKind.NotShared, shareKind, "Expected TestValidator.ServerMethod not to be shared"); shareKind = sts.GetMethodShareKind(typeof(TestValidatorServer).AssemblyQualifiedName, "IsValid", new string[] { typeof(TestEntity).AssemblyQualifiedName, typeof(ValidationContext).AssemblyQualifiedName }); Assert.AreEqual(CodeMemberShareKind.NotShared, shareKind, "Expected TestValidator.IsValid not to be shared"); TestHelper.AssertNoErrorsOrWarnings(logger); } }
/// <summary> /// Generates client proxy source code using the generator specified by <paramref name="codeGeneratorName"/>. /// </summary> /// <param name="options">The options to use for code generation.</param> /// <param name="parameters">The parameters required to create the <see cref="ISharedCodeService"/>.</param> /// <param name="loggingService">The service to use for logging.</param> /// <param name="codeGeneratorName">Optional generator name. A <c>null</c> or empty value will select the default generator.</param> /// <returns>The generated source code or <c>null</c> if none was generated.</returns> public string GenerateCode(ClientCodeGenerationOptions options, SharedCodeServiceParameters parameters, ILoggingService loggingService, string codeGeneratorName) { Debug.Assert(options != null, "options cannot be null"); Debug.Assert(parameters != null, "parameters cannot be null"); Debug.Assert(loggingService != null, "loggingService cannot be null"); AppDomainUtilities.ConfigureAppDomain(options); using (SharedCodeService sharedCodeService = new SharedCodeService(parameters, loggingService)) { CodeGenerationHost host = new CodeGenerationHost(loggingService, sharedCodeService); return(this.GenerateCode(host, options, parameters.ServerAssemblies, codeGeneratorName)); } }
internal static SharedCodeService CreateSharedCodeService(string clientProjectPath, ILoggingService logger) { List <string> sourceFiles = CodeGenHelper.ClientClassLibSourceFiles(clientProjectPath); List <string> assemblies = CodeGenHelper.ClientClassLibReferences(clientProjectPath, true); SharedCodeServiceParameters parameters = new SharedCodeServiceParameters() { SharedSourceFiles = sourceFiles.ToArray(), ClientAssemblies = assemblies.ToArray(), ClientAssemblyPathsNormalized = CodeGenHelper.GetClientAssemblyPaths() }; SharedCodeService sts = new SharedCodeService(parameters, logger); return(sts); }
public void SharedCodeService_Ctor() { SharedCodeServiceParameters parameters = new SharedCodeServiceParameters() { ClientAssemblies = new string[] { "clientAssembly" }, ServerAssemblies = new string[] { "serverAssembly" }, ClientAssemblyPathsNormalized = new string[] { "clientPaths" }, SharedSourceFiles = new string[] { "sharedSourceFiles" }, SymbolSearchPaths = new string[] { "symSearch" } }; ConsoleLogger logger = new ConsoleLogger(); using (SharedCodeService sts = new SharedCodeService(parameters, logger)) { } }
internal static SharedCodeService CreateSharedCodeService(string clientProjectPath, ILoggingService logger) { var sourceFiles = ClientClassLibSourceFiles(clientProjectPath); var assemblies = ClientClassLibReferences(clientProjectPath, true); var parameters = new SharedCodeServiceParameters { SharedSourceFiles = sourceFiles.ToArray(), ClientAssemblies = assemblies.ToArray(), ClientAssemblyPathsNormalized = Enumerable.Empty <string>().ToArray() }; var sts = new SharedCodeService(parameters, logger); return(sts); }
public void SharedCodeService_Ctors() { string projectPath = null; string outputPath = null; TestHelper.GetProjectPaths("", out projectPath, out outputPath); string clientProjectPath = CodeGenHelper.ClientClassLibProjectPath(projectPath); ConsoleLogger logger = new ConsoleLogger(); using (SharedCodeService sts = CodeGenHelper.CreateSharedCodeService(clientProjectPath, logger)) { ConstructorInfo ctor = typeof(TestValidator).GetConstructor(new Type[] { typeof(string) }); Assert.IsNotNull("Failed to find string ctor on TestValidator"); CodeMemberShareKind shareKind = sts.GetMethodShareKind(typeof(TestValidator).AssemblyQualifiedName, ctor.Name, new string[] { typeof(string).AssemblyQualifiedName }); Assert.AreEqual(CodeMemberShareKind.SharedByReference, shareKind, "Expected TestValidator ctor to be shared by reference"); TestHelper.AssertNoErrorsOrWarnings(logger); } }
public void SharedCodeService_Properties() { string projectPath = null; string outputPath = null; TestHelper.GetProjectPaths("", out projectPath, out outputPath); string clientProjectPath = CodeGenHelper.ClientClassLibProjectPath(projectPath); ConsoleLogger logger = new ConsoleLogger(); using (SharedCodeService sts = CodeGenHelper.CreateSharedCodeService(clientProjectPath, logger)) { CodeMemberShareKind shareKind = sts.GetPropertyShareKind(typeof(TestEntity).AssemblyQualifiedName, "ServerAndClientValue"); Assert.AreEqual(CodeMemberShareKind.SharedByReference, shareKind, "Expected TestEntity.ServerAndClientValue property to be shared by reference."); shareKind = sts.GetPropertyShareKind(typeof(TestEntity).AssemblyQualifiedName, "TheValue"); Assert.AreEqual(CodeMemberShareKind.NotShared, shareKind, "Expected TestEntity.TheValue property not to be shared in source."); } }
public void SharedCodeService_Types() { string projectPath = null; string outputPath = null; TestHelper.GetProjectPaths("", out projectPath, out outputPath); string clientProjectPath = CodeGenHelper.ClientClassLibProjectPath(projectPath); ConsoleLogger logger = new ConsoleLogger(); using (SharedCodeService sts = CodeGenHelper.CreateSharedCodeService(clientProjectPath, logger)) { // TestEntity is shared because it is linked CodeMemberShareKind shareKind = sts.GetTypeShareKind(typeof(TestEntity).AssemblyQualifiedName); Assert.AreEqual(CodeMemberShareKind.SharedByReference, shareKind, "Expected TestEntity type to be shared by reference"); // TestValidator is shared because it is linked shareKind = sts.GetTypeShareKind(typeof(TestValidator).AssemblyQualifiedName); Assert.AreEqual(CodeMemberShareKind.SharedByReference, shareKind, "Expected TestValidator type to be shared by reference"); // SharedClass is shared because it is linked shareKind = sts.GetTypeShareKind(typeof(SharedClass).AssemblyQualifiedName); Assert.IsTrue(shareKind == CodeMemberShareKind.SharedBySource, "Expected SharedClass type to be shared in source"); // DomainService exists only in the server and is not shared shareKind = sts.GetTypeShareKind(typeof(DomainService).AssemblyQualifiedName); Assert.IsTrue(shareKind == CodeMemberShareKind.NotShared, "Expected DomainService type not to be shared"); // TestValidatorServer exists only on the server and is not shared shareKind = sts.GetTypeShareKind(typeof(TestValidatorServer).AssemblyQualifiedName); Assert.IsTrue(shareKind == CodeMemberShareKind.NotShared, "Expected TestValidatorServer type not to be shared"); // CodelessType exists on both server and client, but lacks all user code necessary // to determine whether it is shared. Because it compiles into both projects, it should // be considered shared by finding the type in both assemblies shareKind = sts.GetTypeShareKind(typeof(CodelessType).AssemblyQualifiedName); Assert.IsTrue(shareKind == CodeMemberShareKind.SharedByReference, "Expected CodelessType type to be shared in assembly"); } }
/// <summary> /// Generates client proxy source code using the generator specified by <paramref name="codeGeneratorName"/>. /// </summary> /// <param name="options">The options to use for code generation.</param> /// <param name="parameters">The parameters required to create the <see cref="ISharedCodeService"/>.</param> /// <param name="loggingService">The service to use for logging.</param> /// <param name="codeGeneratorName">Optional generator name. A <c>null</c> or empty value will select the default generator.</param> /// <returns>The generated source code or <c>null</c> if none was generated.</returns> internal string GenerateCode(ClientCodeGenerationOptions options, SharedCodeServiceParameters parameters, ILoggingService loggingService, string codeGeneratorName) { Debug.Assert(options != null, "options cannot be null"); Debug.Assert(parameters != null, "parameters cannot be null"); Debug.Assert(loggingService != null, "loggingService cannot be null"); try { AppDomainUtilities.ConfigureAppDomain(options); LoadOpenRiaServicesServerAssembly(parameters, loggingService); using (SharedCodeService sharedCodeService = new SharedCodeService(parameters, loggingService)) { CodeGenerationHost host = new CodeGenerationHost(loggingService, sharedCodeService); return(this.GenerateCode(host, options, parameters.ServerAssemblies, codeGeneratorName)); } } catch (Exception ex) { // Fatal exceptions are never swallowed or processed if (ex.IsFatal()) { throw; } // Any exception from the code generator is caught and reported, otherwise it will // hit the MSBuild backstop and report failure of the custom build task. // It is acceptable to report this exception and "ignore" it because we // are running in a separate AppDomain which will be torn down immediately // after our return. loggingService.LogError(string.Format(CultureInfo.CurrentCulture, Resource.ClientCodeGenDispatecher_Threw_Exception_Before_Generate, ex.Message)); loggingService.LogException(ex); return(null); } }