C# 设计时路径

6
我正在使用一些C#自定义控件(如表单、按钮等),它们使用皮肤系统,并且依赖于项目文件夹中的外部图像(在一个zip文件中)。现在,表单设计器无法显示控件,因为我无法获取到正确的zip文件路径。我需要一种在设计时获取程序集或解决方案路径的方法。
我正在使用两个项目:
DLL - 包含自定义控件。
主机应用程序 - 引用DLL并使用自定义控件。
在我的DLL自定义控件类中,在运行时,我只是简单地使用:
string skinPath = "./Skins/" + skin + ".zip";

这段文字的翻译是:“程序可以完美运行,但设计时表单设计器会显示错误:
”。
Could not find a part of the path 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Skins\Black.zip'.

在浏览了该网站上类似的问题后,我也尝试了以下方法:
1)

if (designMode)
{
    EnvDTE.DTE dte = GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
    string path = Path.GetDirectoryName(dte.Solution.FullName);
}

表单设计器显示错误:
Object reference not set to an instance of an object.

2)

if (designMode)
{
    ITypeResolutionService typeResService = GetService(typeof(ITypeResolutionService)) as ITypeResolutionService;
    string path = typeResService.GetPathOfAssembly(Assembly.GetExecutingAssembly().GetName());
}

表单设计器显示错误:
Object reference not set to an instance of an object.

3) 使用Assembly类的各种不同路径。

迄今为止还没有成功。 我正在使用Visual C# 2010 Express。


不要那样使用as,而应该使用强制转换。 - Mark Byers
抱歉,但那不是我的代码。我一直在从许多不同的问题中复制和粘贴代码,尝试不同的解决方案。 - Snip3r
然后将 Black.zip 复制到 C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/Skins/ :) - L.B
真的不太方便,是吧 :P - Snip3r
是的,但这是一个快速解决方案 :) - L.B
1个回答

1

你的第二次尝试(ITypeResolutionService)应该可以正常工作。只需确保您调用GetService足够晚,以便Site属性不为null。OnHandleCreated是可以的,控件构造函数太早了,会产生NullReferenceException


这解决了问题。非常感谢你。虽然选项2中的代码没有起作用,但你关于过早调用它的说法是正确的。我在OnLoad事件处理程序中添加了选项1中的代码,然后就成功了:D 非常感谢。 - Snip3r
进一步更新,稍微调整路径后,选项2也可以正常工作 :) - Snip3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接