C# GetWebResourceUrl。无法获取嵌入的资源url
我正在尝试通过GetWebResourceUrl获取嵌入式图像资源url 情况: 编写Visual Studio包(扩展名)。单击我的菜单按钮,我想复制位于C# GetWebResourceUrl。无法获取嵌入的资源url,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在尝试通过GetWebResourceUrl获取嵌入式图像资源url 情况: 编写Visual Studio包(扩展名)。单击我的菜单按钮,我想复制位于AssemblyName1中的所有嵌入式资源。在资源类型text/css中,我有这样的url: background-image: url('<%=WebResource("PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png")%>'); 我将程序集(AssemblyN
AssemblyName1
中的所有嵌入式资源。在资源类型text/css
中,我有这样的url:
background-image: url('<%=WebResource("PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png")%>');
我将程序集(AssemblyName1
)挂接到我的VSPackage
程序集。
在程序集名称1
中:
[assembly: WebResource("PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png", "image/png")]
PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png
添加到嵌入式资源
在VSPackage assembly中,我编写:
System.Reflection.MemberInfo[] methodCandidates = typeof(System.Web.Handlers.AssemblyResourceLoader).GetMember("GetWebResourceUrlInternal",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
foreach (var methodCandidate in methodCandidates)
{
var method = methodCandidate as System.Reflection.MethodInfo;
if (method == null || method.GetParameters().Length != 5) continue;
object result = method.Invoke(null,
new object[]
{
System.Reflection.Assembly.GetAssembly(typeof(PSK.Web.UI.Controls.PSKSoftApp.PSKSoftApp)),
"PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png",
false,
false,
null
});
}
召唤
method.Invoke(null, new object[] {System.Reflection.Assembly.GetAssembly(typeof(PSK.Web.UI.Controls.PSKSoftApp.PSKSoftApp)),
"PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png", false, false, null});
返回异常:{“值不能为空。\r\n参数名称:basepath”}
这是什么?我应该在哪里设置它?因为这是谷歌上最热门的评论,我找不到相关的答案,下面是我发现的原因和解决方案(对我来说): 情况:尝试在我构建的服务器控件上对一些公共方法进行单元测试,该控件包含对WebResource的请求 错误:“基本路径”为空 原因:控件向页面请求Web资源。页面要求ScriptManager请求所述资源。ScriptManager做了一些内部工作并试图请求WebResource,但遇到了“basepath”问题 因为这是一个单元测试,所以没有web服务器。没有web服务器意味着脚本管理器不知道要为其发出请求的“基本路径”。没有“basepath”意味着它无法为所述资源构造HTTP请求 解决方案:两种选择: A) 在单元测试中模拟/注入web服务器,以允许页面/脚本管理器生成基本路径并发出适当的请求。在线上有这方面的资源,但我找到的最好的(但没有使用)引用了[AspNetDevelopmentServer]属性的使用。我没有使用这个解决方案,因为我们有一个持续集成构建服务器,我不想在所有开发人员机器和构建服务器上进行测试。这可能很容易,但我没有尝试 B) 重新设计控件,使webresource请求位于服务器控件的不可测试(无需努力)部分。我正在使用CreateChildControls(自动调用),并将webresource请求移动到OnInit。这可能不是最好的做法,但对我来说很有效
method.Invoke(null, new object[] {System.Reflection.Assembly.GetAssembly(typeof(PSK.Web.UI.Controls.PSKSoftApp.PSKSoftApp)),
"PSK.Web.UI.Controls.PSKSoftApp.Css.AppHeader.sprite.png", false, false, null});