【问题标题】:how to get a function from a c# with envdte in PowerShell?如何在 PowerShell 中使用 envdte 从 c# 获取函数?
【发布时间】:2018-07-25 05:11:52
【问题描述】:

我想在 c# 文件中找到一个函数,并用 powershell 对 body 进行一些更改。我读过这个page,但我不明白。

【问题讨论】:

    标签: c# powershell envdte


    【解决方案1】:

    下面的代码找到一个c#文件并返回一个CodeElement对象,在里面你可以操作函数体、参数、属性等。

        #Find the file
        function global:GetFile { param($Project,[string]$Path)
        $result = $false
        $directories = $Path -split '\\'
        if($directories[0]) {
            for($i=0;$i -lt $directories.count;$i++) {
                if(($Project).ProjectItems) {
                    $Project = ($Project).ProjectItems | Where-Object { $_.Name -eq $directories[$i]}       
                }   
            }
            if(!$Project) 
            { write-host "File not found"  }
            else  
            {  $result =  $Project   }
        }
        return $result
        }
        #Find the function
        function global:GetFunctionAsCM {
            param([object] $Project,[string] $Path,[string] $rootnamespaceSpace,[string]$partialFileName=$null)
    
            $file = GetFile -Project $Project -Path $Path
    
            $namespaceParts = $rootnamespaceSpace.Split(".")
            $codeModel = $file.ContainingProject.CodeModel
            $rootnamespace = $namespaceParts[0]
    
            for($i = 0; $i -lt $namespaceParts.Length;$i++) {           
                if ($codeModel.Kind -eq $null) {
                    $codeModel = $CodeModel.CodeElements | Where-Object {$_.FullName -eq $rootnamespace}
                } elseif ($codeModel.Kind -eq [EnvDTE.vsCMElement]::vsCMElementNamespace) {
                    $codeModel = $CodeModel.Members | Where-Object {$_.FullName -eq $rootnamespace}
                } elseif ($codeModel.Kind -eq [EnvDTE.vsCMElement]::vsCMElementClass) {
                    if($partialFileName -ne $null -and $codeModel.Parts.length>1) { 
                        $codeModel = $codeModel.Parts | Where-Object {$_.ProjectItem.Name -eq $partialFileName}
                    }
                    $codeModel = $codeModel.Children | Where-Object {$_.FullName -eq $rootnamespace}   
                }
                $rootnamespace  = "$rootnamespace." + $namespaceParts[$i+1]
            }   
            return $codeModel
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      相关资源
      最近更新 更多