Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ProgID获取dll目录_C#_Dll - Fatal编程技术网

C# 从ProgID获取dll目录

C# 从ProgID获取dll目录,c#,dll,C#,Dll,我正在使用 Type progID = Type.GetTypeFromProgID(SimpleConfiguration.currentConfiguration.OPOSWrappedSO); 我还想将此dll的路径添加到path环境变量中。有没有办法从类型中获取目录 谢谢,那太晚了。如果这起作用,那么COM已经在没有您帮助的情况下找到了DLL。这是正常的,COM服务器不需要路径。@HansPassant完全同意-我需要设置它,以便第三方程序稍后可以找到它。没有办法从COM api获取

我正在使用

Type progID =  Type.GetTypeFromProgID(SimpleConfiguration.currentConfiguration.OPOSWrappedSO);
我还想将此dll的路径添加到path环境变量中。有没有办法从类型中获取目录


谢谢,那太晚了。如果这起作用,那么COM已经在没有您帮助的情况下找到了DLL。这是正常的,COM服务器不需要路径。@HansPassant完全同意-我需要设置它,以便第三方程序稍后可以找到它。没有办法从COM api获取此信息,这是故意的。Pinvoking GetModuleHandle+GetModuleFileName可能是最不重要的。@HansPassant。可能是我的误解,但我没有使用GetModuleHandle的dll名称(只有progID)。下面发布了一个可能的解决方案,涉及到注册拖网。是的,我避免提及这一点,因为HKCU和HKLM以及注册重定向都让人头疼。这在大多数情况下都会起作用,太晚了。如果这起作用,那么COM已经在没有您帮助的情况下找到了DLL。这是正常的,COM服务器不需要路径。@HansPassant完全同意-我需要设置它,以便第三方程序稍后可以找到它。没有办法从COM api获取此信息,这是故意的。Pinvoking GetModuleHandle+GetModuleFileName可能是最不重要的。@HansPassant。可能是我的误解,但我没有使用GetModuleHandle的dll名称(只有progID)。下面发布了一个可能的解决方案,涉及到注册拖网。是的,我避免提及这一点,因为HKCU和HKLM以及注册重定向都让人头疼。它在大多数情况下都有效。
    public static string GetDLLPathFromClassID(string classID)
    {
        var regPath = @"\CLSID\" + classID + @"\InProcServer32\";
        return  GetDefaultRegistryValue(Registry.ClassesRoot, regPath);
    }

    public static string GetClassIDFromProgID(string progID)
    {
            var regPath =   progID + @"\CLSID\";
            return  GetDefaultRegistryValue(Registry.ClassesRoot, regPath);
    }

    private static string GetDefaultRegistryValue(RegistryKey rootKey, string regPath)
    {
        try
        {
            var regPermission = new RegistryPermission(RegistryPermissionAccess.Read,
                                                       @"HKEY_CLASSES_ROOT\" + regPath);
            regPermission.Demand();
            using (var regKey = rootKey.OpenSubKey(regPath))
            {
                if (regKey != null)
                {
                    string defaultValue = (string) regKey.GetValue("");
                    {
                        return defaultValue;
                    }
                }
            }
        }catch(Exception e)
        {
           //log error
        }
        return "";
    }

    public static string GetDLLDirectoryFromProgID(string progID)
    {
        var classID = GetClassIDFromProgID(progID);
        var fileName = GetDLLPathFromClassID(classID);
        if(string.IsNullOrEmpty(fileName))
        {
            return "";
        }
        return Path.GetDirectoryName(fileName);
    }