{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Ocean plug-in deployment","description":"Accelerate E&P application development and protect your innovation by consuming our Data and Domain APIs / Platform APIs.","lang":"en-US","meta":[{"name":"robots","content":"noindex"}],"llmstxt":{"hide":true,"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"ocean-plug-in-deployment","__idx":0},"children":["Ocean plug-in deployment"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"deployment-overview","__idx":1},"children":["Deployment overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The way a plug-in is deployed depends on the environment. There are two main deployment scenarios:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Commercial deployment to the Petrel user"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Deployment during development"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This chapter primarily presents deployment as it relates to the Petrel user. There are two main user deployment mechanisms:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," (Plug-In Package) file"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".msi"]}," (Microsoft installer) file"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ocean has wizards to assist you with either of these deployment mechanisms. A plug-in must be installed by using a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file, although that installation may be done as part of an MSI installation."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ocean provides wizards, in the form of Visual Studio Templates, to create Ocean installer projects. There are two types of installer wizards:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PipBuilder:"]}," PipBuilder creates a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file that the Petrel Plug-in Manager uses to install the plug-in. The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file is a specialized file that contains the assemblies required by the plug-in and an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".xml"]}," file with plug-in information."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ocean Wix Plug-in Installer:"]}," The Ocean Wix Plug-in Installer creates a project that builds an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".msi"]}," (Microsoft Installer) file. The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".msi"]}," file performs the installation of the previously built ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{"align":"center"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image21.c34d9e5973c0d143d8277a8e26146a011dc83310b08566e43daf97da3f3618d6.24bc979a.png"},"children":[]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Figure 2‑1 Ocean wizards in Visual Studio New project dialog box",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Signing plug-in assemblies and using a trust to provide security for the plug-in is discussed in the context of each deployment mechanism."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["By default, plug-ins are installed to a folder name that is a combination of the plug-in name and the version. You may provide a custom folder name."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"pipbuilder-installer","__idx":2},"children":["PipBuilder installer"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The PipBuilder project creates a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file by using the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," utility (discussed later) that is used to install the plug-in. The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file is directly installed by the Petrel Plug-in Manager or installed via a command-line utility in the MSI installer. The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file is a specialized file that contains the assemblies required by the plug-in and an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".xml"]}," file with plug-in identity information."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you use the PipBuilder, your plug-in has an instance of the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin"]}," class. You specify the trust associated with the modules in the plug-in by setting the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Trust"]}," property in your ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin"]}," implementation."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The recommendation is for your plug-in assembly to be signed with a strong name. Signing provides both uniqueness and security to your plug-in assembly. If your plug-in is going to be distributed through the Ocean Store then signing it with a strong name is required. Find information on signing on ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"http://msdn.microsoft.com/en-us/library/xc31ft41.aspx"},"children":["Microsoft's MSDN"]}," website or by Googling \"Visual studio strong name signing.\""]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The PipBuilder wizard in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Visual Studio Add New Project"]}," dialog box is added to Visual Studio during the installation of Ocean. The basic workflow for the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file is divided into two parts:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The plug-in developer creates the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Petrel user then installs the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"plug-in-developer-workflow","__idx":3},"children":["Plug-in developer workflow"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The plug-in developer follows these steps:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the PipBuilder wizard to create a Visual Studio project. The     project references other Visual Studio projects in the Visual Studio     solution that contain the plug-ins to be installed."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you have any third-party, non-Ocean assemblies that your plug-in    uses or other files that must be installed along with your assembly,    add them to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["DeployList.xml"]}," file of the installer project.    Alternately, copy all required files into the directory of the main    plug-in assembly as a part of the build event or custom build    activities before calling the PluginPackager utility."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Build your Visual Studio solution, which results in a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file    that contains the assemblies required by your plug-in and a    ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin.xml"]}," file that defines the properties of your plug-in."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Find details of how to run the PipBuilder wizard in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["UsingTheOceanWizard.pdf"]}," document in your Ocean installation area, ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wizards"]}," subdirectory."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," utility used to create the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file supports sharing DLLs between different plug-ins. It automatically adds the list of the plug-in's assemblies in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin.xml"]}," metafile when building the PIP. The list is then populated to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," when the plug-in is installed and used by Ocean to resolve assembly references between plug-ins."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"plug-in-validation","__idx":4},"children":["Plug-in validation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ocean Plug-in Acceptance Criteria and Checklist"]}," defines rules for well-behaved plug-ins. These rules are validated when plug-ins are submitted to the Ocean Store. Sometimes the plug-ins are rejected, and the plug-in developers must modify and re-test their plug-in. This is costly and prolongs the plug-in time-to-market. Furthermore, there are numerous plug-ins outside the store, both Schlumberger and client-owned, that do not go through the quality check process. Many Petrel minor releases faced compatibility issues with such plug-ins and about half of the time, the root cause was in the plug-ins' lack of adherence to the Ocean Acceptance check list rules. This causes Petrel releases to be delayed by days or weeks and the Petrel upgrade-installer to implement extra logic to make the plug-ins work after the upgrade. To make sure such issues are known and captured well in advance, long before the plug-in is released to the Ocean Store, Ocean has implemented the Plug-in Acceptance Criteria into the Ocean developer tools and the Framework. The plug-in validation mechanism outputs all warnings and errors detected at plug-in packaging time (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe /p"]}," command when the PipBuilder project is built) to the console."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"internal-petrel-libraries","__idx":5},"children":["Internal Petrel libraries"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All usage of Petrel internal assemblies is generally discouraged as they are not covered by the stability promise. A plug-in that uses a Petrel internal assembly may break at any minor Petrel release. If you have a special need to use Petrel internal functionality encapsulated in an internal assembly, please contact the Ocean Portfolio so that they record a requirement to expose such functionality as part of the public API."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," assumes that files in the Petrel installation directory tree other than those in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Extensions"]}," folder are internal Petrel libraries. If you have a copy of these files in your plug-in directory structure, the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," fails to package the plug-in and reports which Petrel internal assemblies it found that you are using. Consequently, all Ocean assembly references in your plug-in Visual Studio project must have the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Copy Local"]}," property set to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["False"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{"align":"center"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image22.80481a6e8477e4601beb11855e49b7d3362e3067f93d3db733273a1c7e2d1d4e.24bc979a.png"},"children":[]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Figure 2‑2 Copy Local for Ocean references must be False",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"using-c-libraries","__idx":6},"children":["Using C libraries"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The best practice for referencing a C dll in your plug-in is to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["DllImport"]}," the C library"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PInvoke"]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["SetDllDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)"]}," before referring to an external call"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add the C dll to both the plug-in's build output directory and the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["DeployList.xml"]}," file of the installer project"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["While copying C dlls to the Petrel installation folder for debugging purposes may be necessary, this is not allowed in the final build environment for production. Because the C dlls are in the Petrel installation folder, they are assumed to be internal Petrel assemblies. While they remain there, you aren't allowed to add the C dlls to your plug-in deploy list (since you are not allowed to deploy duplicate Petrel assemblies) and the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," fails to package the plug-in because it thinks you are using internal Petrel assemblies."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"plug-in-validation-waiver","__idx":7},"children":["Plug-in validation waiver"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["There are cases where the plug-in validation outputs validation errors to the console and stops the plug-in packaging operation. Petrel internal assembly usage is one of these conditions where the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," fails to package the plug-in if the validation detects this condition. If you already have a waiver to use a Petrel internal assembly (or know that you will get one), then please use the following syntax to ignore the validation errors that occur when a Petrel internal assembly is used:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"PluginPackager.exe /p <plugin_assembly> <output pip file> petrel.exe /waiveValidationErrors=\"PluginDependsOnPetrelInternalLibRule:<petrel_internal_assembly_name> | PluginDependsOnPetrelInternalLibRule:<another_petrel_internal_assembly_name>\"\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"third-party-library-validation","__idx":8},"children":["Third party library validation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Third party library validation in the plug-in packager validates third party libraries referenced in the plug-in against a third party list in PlatformLibraries.xml and from other commercial Ocean plug-ins in OtherPluginLibraries.xml. This validation is done by comparing the name hash and md5 checksum. The lists are updated periodically. For more information, please refer to the \"Plug-in Identity and Deployment\" white paper in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["OceanForPetrel.chm"]}," file."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"integrate-plug-in-help-into-petrel-help","__idx":9},"children":["Integrate plug-in help into Petrel help"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ocean provides the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HelpService"]}," API to allow the plug-in developer to register help items for their plug-in. These help items are either existing files on the file system (like pdf or html files) or custom actions. Help items are always displayed in the Help Center under My Plug-ins."]},{"$$mdtype":"Tag","name":"p","attributes":{"align":"center"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image23.1ee28d67cd7bef3a256fcf703bde863cb8a5138d2c9a666862ab9b4fb9fac658.24bc979a.png"},"children":[]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Figure 2‑3 Help items in Help Center",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you run the PIPBuilder wizard, the wizard does several things with the plug-in help files that you include:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Registers them in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["IModule"]}," implementation by using ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HelpService"]}," so the help displays in the Petrel Help Center.\\ For more information and examples on using the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HelpService"]}," in your plug-in, see \"Manage plug-in help files\" in ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["Ocean for Petrel Developer's Guide Volume 9: Petrel User Interface."]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Copies the help files to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HelpFiles"]}," subdirectory of your PIP Visual Studio project."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Adds the help files to the PIP Visual Studio project PluginPackager postbuild event by using the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["--helpfile"]}," option so the help files are packaged with the plug-in."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["At install time, the PluginPackager automatically indexes the plug-in HTML help files listed in the postbuild event to enable searching them in the Petrel Help Center. You must add metadata to your .html help file for this indexing to work correctly. See \"Add metadata to .html help\" on page ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#add-metadata-to-.html-help"},"children":["2-8"]}," for more information."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This example shows the PluginPackager postbuild event:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"\"%OCEAN2026HOME%\\PluginPackager.exe\" /p\n\"$(ProjectDir)\\obj\\copytemp\\ExamplePlugin.dll\"\n\"$(TargetDir)\\$(TargetName).pip\" \"%OCEAN2026HOME%\\petrel.exe\" -helpfile \"$(ProjectDir)\\HelpFiles\\Plugin Help.htm\"\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Only HTML files are indexed for searching in the Petrel Help Center. All plug-in help files are required to be HTML format to be able to integrate into GURU help and enable indexing. The Ocean PIP BuilderWizard only supports adding help htm files and zip files of customGuru pages."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Multiple help file folders may be created during subsequent builds of the PipBuilder project. To avoid this issue, the PipBuilder wizard adds this command in the prebuild event of the PipBuilder project:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"rmdir \"$(ProjectDir)\\obj\\copytemp\" /s /q\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"add-metadata-to-html-help","__idx":10},"children":["Add metadata to .html help"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Guru supports searching against and viewing HTML documentation only. When a HTML help page is added to Guru via the PluginPackager, the page gets indexed so that it is searchable by the Petrel user. Starting from Ocean 2015, you need to add metadata to your help content HTML for the indexing to happen correctly at install time. If no metadata is added, only the page title is indexed."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The page title is always indexed; it is obtained from the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<title>"]}," tag in the header. The title field is the display name of the page you are indexing. For example, if your page is called \"2D seismic interpretation\", the HTML tag reads:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"<title>2D seismic interpretation</title>\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The metadata includes page information such as description and keywords and also associated metadata such as the domain and difficulty. If no value is found for a field it is left blank and it cannot be searched against."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<meta>"]}," tags in the html ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<Head>"]}," are used by the indexer and they need to be set to have more than the title indexed (particularly the keywords field)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The data that is indexed needs to be in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<Head>"]}," section of the HTML file. The format expected for each field is:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<meta name=\"*field*\" content=\"*data*\"/>"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note:"]}," The syntax of this tag is very important. The name attribute must come before the content attribute and the tag must be terminated with a forward slash. Do not use a full closing tag (i.e. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["</meta>"]},")."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Table 2"]}," shows the available fields and the data that may be entered."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Table 2"]}," Guru metadata fields and values"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Description"},"children":["Description"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Values"},"children":["Values"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["keywords"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Words related to the page content. Used in search."]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Any plain text"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["description"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The description of the page. This is displayed in the search results."]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Any plain text value"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["domain"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The domain of the page. This is displayed in the search results."]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["General ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Geophysics ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Reservoir Engineering ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Geology ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Exploration Geology ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Shale ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Studio ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Production ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Drilling"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["difficulty"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The level of difficulty of the content contained in the page."]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Introductory ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Intermediate ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Advanced"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["pagetype"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The type of the page."]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["General ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Workflow ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Training ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Quick Guide ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Links ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Flowchart ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Practical ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Theory ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Quality Check"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["author"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The company or individual who authored the page."]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Any plain text value."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["contentId"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["The ID of the page. Allows pages and files to change name over time but the page to be classed as the same."]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Any string value. (If you do not have a standard in place, it is suggested to use GUIDs)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Multiple entries are valid for the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["keywords"]}," field. Each keyword entry is delimited by the string \" , \" (space comma space). The expected format of multiple entries is:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"<meta name=\"keywords\" content=\"keyword1 , keyword2 , keyword3\"/>\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["domain"]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["difficulty"]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["pagetype"]},", and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["author"]}," fields are filters that the Petrel user searches against in Guru."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Values for the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["domain"]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["difficulty"]},", and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["pagetype"]}," fields are case sensitive and must appear exactly as displayed in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Table 2"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This example is the complete contents of a skeleton HTML file with no body. It contains all the fields to be fully indexed into the Guru search system with valid data fields."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"<!DOCTYPE html>\n<HTML>\n<HEAD>\n<title>My page</title>\n<meta name=\"keywords\" content=\"keyword1 , keyword2 , keyword3\"/>\n<meta name=\"description\" content=\"This is an example page that contains metadata to be fully indexed in Guru.\"/>\n<meta name=\"domain\" content=\"Geophysics\"/>\n<meta name=\"difficulty\" content=\"Introductory\"/>\n<meta name=\"pagetype\" content=\"Training\"/>\n<meta name=\"author\" content=\"SLB\"/>\n<meta name=\"contentId\" content=\"76yt7yu-28af-6556-a8a5-t6y7uj839\"/>\n</HEAD>\n<BODY>\n</BODY>\n</HTML>\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"petrel-user-workflow","__idx":11},"children":["Petrel user workflow"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Petrel user follows these steps:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Petrel user starts Petrel and uses the Plug-in Manager (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Help"]}," - ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["Ocean Plug-in Manager"]},"*) to install the plug-in. The install unpacks the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file and modifies the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," file, where installed plug-in information is maintained."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Petrel user restarts Petrel after the plug-in is installed to have the plug-in available in the next Petrel session."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"msi-installer","__idx":12},"children":["MSI installer"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Ocean Wix Plug-in Installer wizard creates a Visual Studio project that, when built, results in an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".msi"]}," (Microsoft Installer) file that installs the plug-in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file that is created by the PipBuilder project."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the Ocean Wix Plug-in Installer project when a simple ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file installation with Plug-in Manager does not meet the needs of your project. You further customize the resulting MSI installer project by adding extra installer actions. It is also possible to combine more than one plug-in (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," files) into one MSI installer as a plug-in bundle, although plug-ins installed together as a bundle cannot be uninstalled individually."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Using the Ocean Wix Plug-in Installer is recommended when you have a special requirement that the PIP project cannot handle (for example, custom actions, pre-/post-installation steps, or installation of third-party prerequisites)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"wix-toolset","__idx":13},"children":["WiX Toolset"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Ocean Wix Plug-in Installer uses WiX Toolset 3.11 or higher for Visual Studio 2022, which you must download and install yourself from ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["wixtoolset.org"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{"align":"center"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image24.9a9bc6515b883835279b4026793d31ea35be41428614818976ac0c336b4e9c71.24bc979a.png"},"children":[]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Figure 2‑4 WiX toolset installation",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"run-installer-wizard","__idx":14},"children":["Run installer wizard"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To use the Ocean Wix Plug-in Installer, follow these steps:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Install the appropriate WixToolset version."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add one or more Ocean Plug-in projects to the solution."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add a PIP Builder project for each plug-in."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Compile the PIP builder projects to create the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," files."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add this Ocean Wix Plug-in Installer project for the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," files."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Wix Plug-in Installer wizard has a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plug-in Startup Optimization"]}," option; by default, it is unselected. To get the best start up performance while loading Petrel, select this option, which enables use of the Native Image Generator (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ngen.exe"]},"). Petrel itself uses Ngen by default to improve start up performance."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Find details for running the Ocean Wix Plug-in Installer wizard in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["UsingTheOceanWizard.pdf"]}," document in your Ocean installation area, ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wizards"]}," subdirectory, and in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["ReadMe.txt"]}," file added to the Ocean Wix Plug-in Installer MSI project."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note: 1."]}," The Ocean Wix Plug-in Installer wizard builds a project that is a generic ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".msi"]}," installer project. The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".msi"]}," is not Ocean-specific, so seek detailed information regarding ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".msi"]}," files through MSDN."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You may find the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["msiexec.exe"]}," command-line utility from Microsoft     helpful in debugging any installer issues. This command has a     variety of options."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You may add your custom installer class that derives from     ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["System.Configuration.Install.Installer"]}," and has the     ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[System.ComponentModel.RunInstaller(true)]"]}," attribute. Its     ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Install"]}," and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Uninstall"]}," methods contain your tasks, which are     called at MSI installation and uninstallation, respectively."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"wix-installation-error","__idx":15},"children":["Wix installation error"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ocean Wix Plug-in Installer"]}," wizard requires prior WIX installation. If you see the error \"The template specified cannot be found. Please check that the full path is correct\" when running the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ocean Wix Plug-in Installer"]}," wizard, you may need to reinstall WIX. This error is generated by Visual Studio when there are no WIX templates installed or available; this may happen if Visual Studio is installed after WIX is installed. Check if you are able to create WIX projects in Visual Studio; go to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Add new Project > Templates > Windows Installer XML > Setup project"]},". If you do not see the Windows Installer XML templates in Visual Studio as shown in Figure 2‑5, you need to reinstall WIX."]},{"$$mdtype":"Tag","name":"p","attributes":{"align":"center"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image25.9df2feef79a8974d44784cdc8997bcc33d843790921d8f2c89dee4a7b8957039.24bc979a.png"},"children":[]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Figure 2‑5 Wix templates required for Ocean Plugin Wix Installer",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"deployment-utilities","__idx":16},"children":["Deployment utilities"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Two command-line deployment utilities are available to use in custom actions in an MSI installer, as build events in the development environment, or in a scripted upgrade scenario (stop Petrel, run PluginManager.exe to uninstall old plug-in version, run PluginManager.exe to install a new plug-in version, run Petrel)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"pluginmanagerexe","__idx":17},"children":["PluginManager.exe"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManager.exe"]}," utility is available in the Petrel installation area. It is used from the command line or from a custom action in an MSI installer to install, uninstall, enable, and disable Ocean for Petrel plug-ins (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," files)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The format of the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["pluginIdentifier"]}," is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["://MyPluginUniqueId/1"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["0"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["0"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["0"]}," when this code is used inthe ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginId"]}," property implementation:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"new PluginIdentifier(\"MyPluginUniqueId\", new Version(1,0,0,0));\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To install a plug-in into ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," in the user's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%AppData%"]}," folder, use this option:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/install inputPIP hostExecutable\nPluginManager.exe /install \"C:DeploymentMyProject.pip\"\"%OCEAN2026HOME%Petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To install a plug-in into ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%ALLUSERSPROFILE%"]}," folder, use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/install"]}," option. Add ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["installerId:your_installer_guid"]}," if you call it from your MSI installer."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/install [/allusers] inputPIP hostExecutable\nPluginManager.exe /install /allUsers \"C:DeploymentMyProject.pip\"\"%OCEAN2026HOME%Petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To uninstall a plug-in from ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," in the user's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%AppData%"]}," folder, use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/uninstall"]}," option."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/uninstall pluginIdentifier hostExecutable\nPluginManager.exe /uninstall ://MyPluginUniqueId/1.0.0.0\"%OCEAN2026HOME%Petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To uninstall a plug-in from ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%ALLUSERSPROFILE%"]}," folder, use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/uninstall"]}," option. Add ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/runFromInstaller"]}," if you call it from your MSI installer."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/uninstall [/allusers] pluginIdentifier hostExecutable\nPluginManager.exe /uninstall /allUsers ://MyPluginUniqueId/1.0.0.0\"%OCEAN2026HOME%Petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To enable a plug-in for all users, use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/enable"]}," option. Use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/allusers"]}," option to enable the plug-in for all users."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/enable [/allusers] pluginIdentifier hostExecutable\nPluginManager.exe /enable /allUsers ://MyPluginUniqueId/1.0.0.0\"%OCEAN2026HOME%Petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To disable a plug-in, use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/disable"]}," option. Use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/allusers"]}," option to disable the plug-in for all users."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/disable [/allusers] pluginIdentifier hostExecutable\nPluginManager.exe /disable /allUsers ://MyPluginUniqueId/1.0.0.0\"%OCEAN2026HOME%Petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/list"]}," option to list installed plug-ins:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/list hostExecutable\nLists plug-ins installed for the specified host application.\n/listAllLocal hostExecutable\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Lists all locally installed plug-ins for the specified host application, under all user profiles."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"pluginpackagerexe","__idx":18},"children":["PluginPackager.exe"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," utility is a command-line utility that is available in the Petrel installation area. It packages a plug-in into a single ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," packs the plug-in under the specified folder and includes all other files and all its subfolders into a single ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," (Petrel Installer Package) file. This means you may copy all required files to the main plug-in assembly directory as part of the project build action or custom build activities before calling PluginPackager. Install the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file with the Ocean Plug-in Manager in Petrel; it installs the plug-in in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file to the plug-in default home."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," utility that is used to create the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file supports sharing DLLs between plug-ins. The utility automatically adds the list of plug-in assemblies to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin.xml"]}," metafile when building the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file. The list is then populated to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," when the plug-in is installed and is used by Ocean to resolve assembly references between plug-ins."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To pack a plug-in in a directory with other deployment files in the same directory and create the . ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["pip"]}," file:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/p <Plugin assembly> <output pip file>\nPluginPackager.exe /p \"C:MyProjectbinDebugMyPlugin.dll\"\"C:DeploymentMyProject.pip\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You must add the path of external libraries (e.g. assemblies that are shared between plug-ins) to the probing paths defined in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe.config"]}," file."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"validate-your-plug-in","__idx":19},"children":["Validate your plug-in"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Validate your plug-in against the Ocean Plug-in Acceptance Test rules by supplying the location of the Petrel executable as the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["hostExecutable"]}," argument to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe /p:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/p <Plugin assembly> <output pip file> <hostExecutable>\nPluginPackager.exe /p \"C:MyProjectbinDebugMyPlugin.dll\"\"C:DeploymentMyProject.pip\" \"%OCEAN2026HOME%petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," returns these error codes:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["0 if there were no validation errors and the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file was created successfully."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The number of validation errors when the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file was created successfully."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["99 if the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[".pip"]}," file could not be created."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/p"]}," is part of a postbuild event, validation errors may cause the build fail. Handle the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," error codes in either the project file or in the postbuild event."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the project file, add this code to the end of the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["csproj"]}," file to ignore the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," exit code:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"<Target\n  Name=\"PostBuildEvent\"\n  Condition=\"'$(PostBuildEvent)'!=''\"\n  DependsOnTargets=\"$(PostBuildEventDependsOn)\">\n  <Exec WorkingDirectory=\"$(OutDir)\" Command=\"$(PostBuildEvent)\" IgnoreExitCode=\"true\" />\n</Target>\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Another way to handle the error code in the project file is to add this example instead to create a build warning; the build succeeds:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"<Target\n  Name=\"PostBuildEvent\"\n  Condition=\"'$(PostBuildEvent)'!=''\"\n  DependsOnTargets=\"$(PostBuildEventDependsOn)\">\n  <Exec WorkingDirectory=\"$(OutDir)\" Command=\"$(PostBuildEvent)\" ContinueOnError=\"true\" />\n</Target>\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This example shows handling the error codes in the postbuild event itself:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"PluginPackager.exe /p <Plugin assembly> <output pip file> <hostExecutable>\n\nif \"%ERRORLEVEL%\" == \"0\" goto End\n\nif \"%ERRORLEVEL%\" == \"99\" goto PipCreationError\n\necho %ERRORLEVEL% Plug-in validation error(s) occurred.\n\ngoto End\n\n:PipCreationError\n\necho pip could not be created.\n\nREM Let the build fail if the pip could not be created\n\nexit 1\n\n:End\n\nREM Post build event always succeeds in case of no errors or plug-in validation errors only\n\nexit 0\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"generate-plug-in-metafile","__idx":20},"children":["Generate plug-in metafile"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Generate a plug-in metafile for a plug-in and then merge that metafile into the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," file for Petrel to install your plug-in in the development environment."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/g"]}," option to generate a plug-in metafile:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/g <Assembly> <output plugin meta file>\nPluginPackager.exe /g \"C:MyProjectbinDebugMyPlugin.dll\"\"C:MyProjectplugin.xml\" \"%OCEAN2026HOME%petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/m"]}," option to merge a plug-in metafile into the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," file for a specific hosting application:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/m <plugin meta file> <hostingapplication> <Plugin Path>\nPluginPackager.exe /m \"C:MyProjectplugin.xml\"\"%OCEAN2026HOME%petrel.exe\" \"C:MyProjectbinDebug\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["/u"]}," option to uninstall a plug-in from the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," file for a specific hosting application:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"/u <PluginIdentifier> <hostingapplication.exe>\nPluginPackager.exe /u \"://MyPlugin/1.0.0.0\"\"%OCEAN2026HOME%petrel.exe\"\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The format of the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["pluginIdentifier"]}," is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["://MyPluginUniqueId/1.0.0.0"]}," when this code is used in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin.PluginId"]}," property implementation:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["new PluginIdentifier(\"MyPluginUniqueId\", new Version(1,0,0,0));"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," has an API which is used internally by the Petrel Plug-in Manager UI."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"during-development","__idx":21},"children":["During development"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For completeness, deployment during the development process is discussed here. When you are developing the plug-in you find that, under normal circumstances, when you build the solution the plug-in is automatically deployed to the Petrel environment on your machine. The build process in Visual Studio follows these steps:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Compiles the plug-in code to create the assembly."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Creates a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["plugin.xml"]}," file in the Visual Studio folder for the    plug-in project."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Merges the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["plugin.xml"]}," file with the    ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," file that is in the user's    ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[AppData]\\Roaming\\Schlumberger\\[Petrel Version]"]}," folder."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The scripting that creates these steps is put in place by the Ocean Wizard when a new plug-in is created in Visual Studio as the project's build events. It uses the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginPackager.exe"]}," utility discussed previously to generate the plug-in metafile and then merge that plug-in metafile into the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginMangerSettings.xml"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"del \"$(ProjectDir)plugin.xml\"\n\n\"%OCEAN2026HOME%\\PluginPackager.exe\" /g \"$(TargetPath)\" \"$(ProjectDir)\\plugin.xml\" \"%OCEAN2026HOME%\\petrel.exe\"\n\n\"%OCEAN2026HOME%\\PluginPackager.exe\" /mh \"$(ProjectDir)\\plugin.xml\" \"%OCEAN2026HOME%\\petrel.exe\" \"$(TargetDir)\"\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"edit-and-continue-debugging","__idx":22},"children":["Edit and continue debugging"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A new feature in Visual Studio 2015 enables edit and continue after you attach the debugger. This allows developers to attach the debugger, pause debugging, edit the code, and then resume without having to restart Petrel. To enable the feature, set up your start-up Visual Studio project ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Debug"]}," section to start ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["cmd.exe"]}," with the arguments that set the crucial environment variable ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["COMPLUS_FORCEENC"]},". Add the following arguments to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Command line arguments"]}," section:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["/C \"set \"COMPLUS_FORCEENC=1\" && \"%OCEAN2026HOME%\\Petrel.exe\"\""]},{"$$mdtype":"Tag","name":"p","attributes":{"align":"center"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image26.3c3fbd02ff07239ee2464d6b1be3bb020421ae7ff72c94303e6644e74b28b53d.24bc979a.png"},"children":[]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Figure 2‑6 Debug settings for the startup project.",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Then either start without debugging (on the debug menu or using Ctrl + F5) or start Petrel directly. Attach to the launched Petrel process after the license dialog comes up. Attaching to Petrel prior to the license dialog causes an error due to a security feature put in place to avoid exposing Petrel's licensing implementation."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"scripting-tool","__idx":23},"children":["Scripting Tool"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A Scripting Tool is available in Visual Studio that runs in conjunction with Petrel. The use case for this tool is to discover new APIs and explore API functionality without you having to build a custom plug-in."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This feature requires a Petrel plug-in, also called Scripting Tool, that pairs the Visual Studio script with Petrel to execute the script code. The Petrel Scripting Tool plug-in is automatically installed into Petrel during the Ocean Framework installation."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Scripting Tool is fully documented in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["OceanWizardsAndDevelopersTools.pdf"]}," found in your Ocean installation ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Getting Started"]}," directory."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"additional-deployment-topics","__idx":24},"children":["Additional deployment topics"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This section contains additional topics that relate to deploying and running your plug-in in Petrel. A ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin"]}," class implementation is mandatory and required for all plug-ins."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"default-plug-in-installation-directory","__idx":25},"children":["Default plug-in installation directory"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["By default, plug-ins are installed to a directory under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[Petrel Home]"]}," called ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["\\Extensions"]},". This folder is considered the default ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[Plug-ins Home]"]}," directory. However, you may install plug-ins in other folders where the user has write permission if, for example, this permission is not allowed under the Petrel installation folder by company policy."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"change-the-installation-location-of-plug-ins","__idx":26},"children":["Change the installation location of plug-ins"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To change the default directory, open the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," file (see locations below), find the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<DefaultDirectory>"]}," tag, and update the value in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Location"]}," parameter with the new path. For example:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"<OceanApplicationShell>\n<ApplicationShell>\n<Name>Petrel</Name>\n<DefaultDirectory Name=\"Default\" Location=\"C:ProgramFilesSchlumbergerPetrel 2026Extensions\" />\n...\n</ApplicationShell>\n</OceanApplicationShell>\ncould be changed to:\n<DefaultDirectory Name=\"Default\" Location=\"C:MyPlugins\" />\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"install-into-a-custom-subdirectory","__idx":27},"children":["Install into a custom subdirectory"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["DeploymentFolder"]}," property defines the relative path where this plug-in is deployed when installed in Petrel. The absolute installation path is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[DefaultDirectory]\\[DeploymentFolder]"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["DeploymentFolder"]}," may contain backslashes to define the hierarchy of folders where plug-ins are deployed."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[DefaultDirectory]"]}," is defined in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%APPDATA%\\Schlumberger\\Petrel\\201X\\PluginManagerSettings.xml"]}," in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<DefaultDirectory>"]}," tag, which is defaulted to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<PetrelInstallDirectory>\\Extensions"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this example, the plug-in is installed in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["MyCompanyName"]}," subdirectory in the Petrel plug-in installation directory."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"public class MyPluginA : Slb.Ocean.Core.Plugin\n{ // ...\n  public override string Name\n  {\n    get { return \"My Plugin A\"; }\n  }\n  public override string DeploymentFolder\n  {\n    get { return \"MyCompanyNamePlugin A\"; }\n  }\n}\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["DeploymentFolder"]}," property is not defined, the plug-in is deployed in a [",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["PluginName"]},"]_[",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["PluginVersion"]},"] relative folder, where ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["PluginName"]}," is defined by ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Plugin.Name"]}," property and ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["PluginVersion"]}," is the version of the main plug-in assembly."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"start-up-performance-statistics","__idx":28},"children":["Start-up performance statistics"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To encourage plug-in developers to improve the start up time of their plug-ins, the initialization time of a plug-in is reported in the Ocean Plug-in Manager user interface."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The start up time is calculated as the total time of all of the plug-in's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["IModule.Initialize"]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["IModule.Integrate"]}," and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["IModule.IntegratePresentation"]},". Only have necessary steps in those module start up methods (like license checks, integrating UI elements, etc.) Move those steps that could be done later to the stage when the plug-in is actually starting to work (for example, on ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Workspace.Opened"]},")."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If a plug-in's initialization time is longer than 1 second, a warning icon and message are displayed in the Ocean Plug-in Manager, as Figure 2‑7 shows."]},{"$$mdtype":"Tag","name":"p","attributes":{"align":"center"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image27.c5303afbaff1bce7bfed037bb0b27887bcb090413cf6ba6631f4005088c34751.24bc979a.png"},"children":[]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Figure 2‑7 Ocean Plug-in manager displaying start up performance warning",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"pluginmanagersettingsxml-locations","__idx":29},"children":["PluginManagerSettings.xml locations"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," contains all the setting information of the Plug-in Manager, including the metadata of all the installed plug-ins. There are multiple copies of ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," to support the full range of single-user scenarios, including those with User Account Control (UAC):"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["In Petrel's installation folder:"]}," Supports a company-wide push deployment of Petrel repackaged together with a number of plug-ins as a monolithic bundle. If Petrel is installed into a UAC-protected folder (for example, the default ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%ProgramFiles%)"]}," then the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," is protected by UAC. Therefore, only administrators may edit it. It cannot be edited through the Petrel Plug-in Manager GUI nor the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManager.exe"]},"."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["In c:\\Users\\All Users"]}," (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%ALLUSERSPROFILE%"]},") ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[":"]}," Supports company-wide push deployment/undeployment of individual plug-ins. UAC elevation is required to edit this file. Manage it with ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManager.exe"]},"."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["In current user's profile"]}," (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%AppData%"]},") ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[":"]}," Supports individual user customization. UAC elevation is not required to edit this file.Manage it using either the Petrel Plug-in Manager GUI or the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManager.exe"]},"."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," files in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%AppData%"]}," and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%ALLUSERSPROFILE%"]}," are automatically created the first time a plug-in is installed into them."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To prevent users from installing plug-ins, remove or comment out the blue highlighted entry from ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["petrel.exe.config"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"<oceanConfiguration productName=\"Petrel 2026.1\"productFamilyName=\"Ocean Petrel\">\n<pluginManagerSettings>\n<pluginProviders>\n<adduri=\"{ApplicationData}SchlumbergerPetrel2024PluginManagerSettings.xml\"typeName=\"Slb.Ocean.Core.Configuration.PluginXmlProvider,Slb.Ocean.Core\" name=\"UserAppData\" />\n<adduri=\"{CommonApplicationData}SchlumbergerPetrel2024PluginManagerSettings.xml\"type-Name=\"Slb.Ocean.Core.Configuration.PluginXmlProvider,Slb.Ocean.Core\" name=\"CommonAppData\" />\n</pluginProviders>\n<securityProvideruri=\"{ApplicationData}SchlumbergerPetrel2024PluginManagerSettings.xml\"typeName=\"Slb.Ocean.Core.PluginSecurityProvider, Slb.Ocean.Core\" />\n</pluginManagerSettings>\n...\n</oceanConfiguration>\n","lang":"java"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The user may still be able to install plug-ins if he or she has administrative permissions. To completely disable plug-in installation, remove the orange highlighted entry."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When Petrel starts up, plug-ins are loaded from all locations in the same order as previously listed (Petrel installation folder, all users, current user). If the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," is found at the specified location, the plug-ins registered in it for the current Petrel installation are loaded. If a plug-in is registered in more than one ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PluginManagerSettings.xml"]}," file, the plug-in is loaded from the first location where it is found."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If a plug-in is already registered in one of the three locations available for plug-in deployment, the Plug-in Manager prevents installation of the plug-in to a different location. You must first remove the plug-in before you install it to a different location."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"log-file-locations","__idx":30},"children":["Log file locations"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["OceanPetrel.log"]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["OceanPetrelException.log"]},", and the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["OceanPerformance.log"]}," files' default location is in the user's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%LocalAppData%\\ Schlumberger\\Petrel\\[Petrel Version]"]}," folder."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The log files are intended to be kept in the user's local profile, but in Windows 7 ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%AppData%"]}," points to the user's roaming profile. For 2024 releases, this is typically\\ c:\\users\\USERNAME\\AppData\\Local\\Schlumberger\\Petrel\\2024."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Do not change this location because the user typically has permissions to write to this directory. However, the user configures it by editing the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["petrel.exe.config"]}," file (located in the Petrel installation directory). Follow these steps:"]},{"$$mdtype":"Tag","name":"ol","attributes":{"start":16},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Open the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["petrel.exe.config"]}," file and locate the    ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<loggingConfiguration section>"]},"."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Edit the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<add fileName=\"OceanPetrel.log\"/>"]}," child element to    look like this:\\    ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<add fileName=\\    \"%LOCALAPPDATA%\\Schlumberger\\Petrel\\<version>\\OceanPetrel.log\"/>"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Make the same edit in the\\    ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<add fileName=\"OceanPetrelException.log\"/>"]}," child element."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Save the file."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After the change, Petrel writes these log files to the logged-in user's area."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"event-logging-tool","__idx":31},"children":["Event logging tool"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The event logging tool helps monitor performance of the Ocean plug-ins and identifies the misbehaving plug-ins if performance degrades."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Any events raised by Ocean go through a central location. This enables users to measure and time all the Ocean plug-in event handlers when they raise API events and then summarize this information to a log file."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the Petrel user notices some performance degradation for a particular task, he or she may enable an option in Petrel under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["System settings"]}," - ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["Troubleshooting"]},"*."]},{"$$mdtype":"Tag","name":"p","attributes":{"align":"center"},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image28.1aafeeb43cd8c2f16f3a9543a4850671a5b18a45c3f845e97fc6ae0d2f6323b2.24bc979a.png"},"children":[]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Figure 2‑8 System settings \\> Troubleshooting settings",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Selecting ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Enable event logging for plug-ins"]}," starts a session and logs the time measurement into memory until the option is disabled. When the option is cleared, summary information is added to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["OceanPerformance.log"]}," file (located in the same directory as ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["OceanPetrel.log"]},"). This information indicates the plug-ins that are called and the time spent for each."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"user-defined-configuration-settings-for-your-plug-in","__idx":32},"children":["User-defined configuration settings for your plug-in"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If your plug-in must write user-defined configuration settings to the computer for future use, the recommended method is to use the standard C# mechanism defined in \"Application Settings Architecture\" (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"http://msdn.microsoft.com/en-us/library/8eyb2ct1.aspx"},"children":["http://msdn.microsoft.com/en-us/library/8eyb2ct1.aspx"]},"). The recommendation is for your plug-in to store its settings in a file located in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%LocalAppData%"]},". In conjunction with Petrel 2026, this gives settings stored in:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<LocalAppData>\\Schlumberger\\petrel.exe_StrongName_\\26.1.0.0\\user.config"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["where:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["<LocalAppData>:"]}," Is the correct location to put plug-in settings that are writable, even if the user is not a system administrator on the computer."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["SLB:"]}," Is the vendor."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["petrel.exe_StrongName_:"]}," Is the strong name of the associated application."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["26.1.0.0:"]}," Is the version, which ensures that that you can install the 2026 and older versions of your plug-in side by side."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["It is very easy to use this standard C# mechanism when you do not need to control what and how settings information is stored to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["%LocalAppData%"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Find additional details in MSDN at these topics:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"http://msdn.microsoft.com/en-us/library/bb397757.aspx"},"children":["How To: Create a New Setting at Design Time"]}," http://msdn.microsoft.com/en-us/library/bb397757.aspx"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"http://msdn.microsoft.com/en-us/library/bb397755.aspx"},"children":["How To: Write User Settings at Run Time with C#"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"http://msdn.microsoft.com/en-us/library/bb397755.aspx"},"children":["http://msdn.microsoft.com/en-us/library/bb397755.aspx"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"http://msdn.microsoft.com/en-us/library/bb397759.aspx"},"children":["How To: Read Settings at Run Time with C#"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"http://msdn.microsoft.com/en-us/library/bb397755.aspx"},"children":["http://msdn.microsoft.com/en-us/library/bb397759.aspx"]}]}]},"headings":[{"value":"Ocean plug-in deployment","id":"ocean-plug-in-deployment","depth":1},{"value":"Deployment overview","id":"deployment-overview","depth":2},{"value":"PipBuilder installer","id":"pipbuilder-installer","depth":2},{"value":"Plug-in developer workflow","id":"plug-in-developer-workflow","depth":3},{"value":"Plug-in validation","id":"plug-in-validation","depth":3},{"value":"Internal Petrel libraries","id":"internal-petrel-libraries","depth":4},{"value":"Using C libraries","id":"using-c-libraries","depth":4},{"value":"Plug-in validation waiver","id":"plug-in-validation-waiver","depth":4},{"value":"Third party library validation","id":"third-party-library-validation","depth":4},{"value":"Integrate plug-in help into Petrel help","id":"integrate-plug-in-help-into-petrel-help","depth":3},{"value":"Add metadata to .html help","id":"add-metadata-to-html-help","depth":3},{"value":"Petrel user workflow","id":"petrel-user-workflow","depth":3},{"value":"MSI installer","id":"msi-installer","depth":2},{"value":"WiX Toolset","id":"wix-toolset","depth":3},{"value":"Run installer wizard","id":"run-installer-wizard","depth":3},{"value":"Wix installation error","id":"wix-installation-error","depth":3},{"value":"Deployment utilities","id":"deployment-utilities","depth":2},{"value":"PluginManager.exe","id":"pluginmanagerexe","depth":3},{"value":"PluginPackager.exe","id":"pluginpackagerexe","depth":3},{"value":"Validate your plug-in","id":"validate-your-plug-in","depth":4},{"value":"Generate plug-in metafile","id":"generate-plug-in-metafile","depth":4},{"value":"During development","id":"during-development","depth":2},{"value":"Edit and continue debugging","id":"edit-and-continue-debugging","depth":3},{"value":"Scripting Tool","id":"scripting-tool","depth":3},{"value":"Additional deployment topics","id":"additional-deployment-topics","depth":2},{"value":"Default plug-in installation directory","id":"default-plug-in-installation-directory","depth":3},{"value":"Change the installation location of plug-ins","id":"change-the-installation-location-of-plug-ins","depth":4},{"value":"Install into a custom subdirectory","id":"install-into-a-custom-subdirectory","depth":4},{"value":"Start-up performance statistics","id":"start-up-performance-statistics","depth":3},{"value":"PluginManagerSettings.xml locations","id":"pluginmanagersettingsxml-locations","depth":3},{"value":"Log file locations","id":"log-file-locations","depth":3},{"value":"Event logging tool","id":"event-logging-tool","depth":3},{"value":"User-defined configuration settings for your plug-in","id":"user-defined-configuration-settings-for-your-plug-in","depth":3}],"frontmatter":{"seo":{"title":"Ocean plug-in deployment"}},"lastModified":"2026-02-09T09:13:13.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/ocean-petrel/dev-guide/11_licensingdeploymentunittesting/11_licensingdeploymentunittesting_2","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}