Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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# GetWebResourceUrl。无法获取嵌入的资源url_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

C# GetWebResourceUrl。无法获取嵌入的资源url

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

我正在尝试通过GetWebResourceUrl获取嵌入式图像资源url

情况:

编写Visual Studio包(扩展名)。单击我的菜单按钮,我想复制位于
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});