44973
お世話になります。

C#でダウンロードフォルダのパスを取得したいと思い、下記のようなソースを記述したのですが、うまく取得できません。  
一応ネットを調べてみたりしたのですが、うまくいかないので、アドバイスをいただけると幸いです。  
C#は最近始めたばかりなので、たぶんどこかがおかしいんだとは思いますが。

```

    using System;
    using System.Collections.Generic;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    public class MainClass{
    public static void Main(){
    Type instanceType = Type.GetTypeFromProgID("Shell.Application");
    dynamic shell = Activator.CreateInstance(instanceType);
    dynamic folder = shell.Namespace("shell:Downloads");
    dynamic directory = folder.Path();
    MessageBox.Show(""+directory);
    }
    }
    
```

なお、環境は、Windows10 64ビットです。  
また、コンパイルはWindows付属の「csc.exe」（.netFramework4用）を利用しています。

以上、よろしくお願いいたします。
CC BY-SA 4.0
2018-06-21T15:14:57.623
44965
2018-06-22T05:04:41.293
29034
question
c#
C#でのCOMのShell.Applicationの利用
わざわざCOMを使わなくてもC#向けのWindowsライブラリで取得できるはずです.

例えば

`Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads");`

参考: [.net - How to programmatically derive windows downloads folder
"%USERPROFILE%/Downloads"? - Stack
Overflow](https://stackoverflow.com/questions/3795023/how-to-programmatically-
derive-windows-downloads-folder-userprofile-downloads)

環境構築が面倒なので動作確認はしていません.
CC BY-SA 4.0
2018-06-21T15:43:33.767
44967
2018-06-21T15:43:33.767
12216
44965
answer
>
```

>     dynamic directory = folder.Path();
>  
```

あと一歩でした。[Shellオブジェクト](https://msdn.microsoft.com/en-
us/library/bb774094\(v=vs.85\).aspx)から[Folderオブジェクト](https://msdn.microsoft.com/en-
us/library/bb787868\(v=vs.85\).aspx)は取得できています。ここで取得できているのは実は[Folder2オブジェクト](https://msdn.microsoft.com/en-
us/library/bb787854\(v=vs.85\).aspx)でもあるため[Selfプロパティ](https://msdn.microsoft.com/en-
us/library/bb787860\(v=vs.85\).aspx)を使用することで[FolderItemオブジェクト](https://msdn.microsoft.com/en-
us/library/bb787810\(v=vs.85\).aspx)が取得できます。そうすれば素直に[Pathプロパティ](https://msdn.microsoft.com/en-
us/library/bb787844\(v=vs.85\).aspx)でフルパスを取得できます。

```

    public static void Main() {
        var instanceType = Type.GetTypeFromProgID("Shell.Application");
        dynamic shell = Activator.CreateInstance(instanceType);
        var folder = shell.Namespace("shell:Downloads");
        string directory = folder.Self.Path;
        MessageBox.Show(directory);
    }
    
```

* * *

ncaqさんはハードコーディングで `Downloads`
というパスを提示していますが、ダウンロードフォルダの場所はプロパティダイアログで移動可能なので、ハードコーディングすべきではありません。

[![ダウンロードフォルダの場所](https://i.stack.imgur.com/l1rHz.png)](https://i.stack.imgur.com/l1rHz.png)
CC BY-SA 4.0
2018-06-21T22:05:24.197
44973
2018-06-22T05:04:41.293
2018-06-22T05:04:41.293
4236
4236
44965
answer