[ 
https://issues.apache.org/jira/browse/IBATISNET-85?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gilles Bayon closed IBATISNET-85.
---------------------------------

    Resolution: Fixed

> Embedded resources fail to load when using VB.Net
> -------------------------------------------------
>
>                 Key: IBATISNET-85
>                 URL: https://issues.apache.org/jira/browse/IBATISNET-85
>             Project: iBatis for .NET
>          Issue Type: Bug
>            Reporter: Ron Grabowski
>            Assignee: Gilles Bayon
>            Priority: Minor
>
> This line loads the embedded file correclty in C#:
>  <providers embedded="Resources.Providers.config, CompanyName.Data" />
> but throws the following exception in VB.Net:
> [NullReferenceException: Object reference not set to an instance of an 
> object.]
>    
> IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument(String 
> resource) +129
> The issue is that C# requires the full namespace to the embedded resource be 
> used with GetManifestResourceStream while in VB.Net only the file name is 
> passed in:
>  
>  http://www.vbbox.com/blog/2004/05/net-resource-management-stringtable.html
>  // C#
>  Assembly assembly = Assembly.GetExecutingAssembly();
>  Stream s = assembly.GetManifestResourceStream("MyApplication.XMLFile1.xml");
>  ' VB.Net
>  Dim asm As Assembly = Assembly.GetExecutingAssembly()
>  Dim s As Stream = asm.GetManifestResourceStream("XMLFile1.xml")
> Here's some debug output I added to GetEmbeddedResourceAsXmlDocument (if you 
> open Resources.cs this will make more sense):
>  fileInfo.AssemblyName: [CompanyName.Data]
>  fileInfo.ResourceFileName: [CompanyName.Data.Resources.Providers.config]
>  assembly.FullName: [CompanyName.Data, Version=0.1.0.0, Culture=neutral, 
> PublicKeyToken=null]
>  assembly.GetManifestResourceNames().Length: [1]
>  assembly.GetManifestResourceNames(): [Providers.config]
>  Could not load embedded resource from assembly
> A fix is to replace this line:
>  Stream stream = 
> assembly.GetManifestResourceStream(fileInfo.ResourceFileName);
> with this:
>  Stream stream = 
> assembly.GetManifestResourceStream(fileInfo.ResourceFileName);
>  if (stream == null)
>  {
>  stream = assembly.GetManifestResourceStream(fileInfo.FileName);
>  }
> There is other code in the GetEmbeddedResourceAsXmlDocument method that calls 
> GetManifestResourceStream(fileInfo.FileName) but I think that code is called 
> only when the assembly name is not specified by the user. Using this notation:
>  <providers embedded="Resources.Providers.config" />
> won't solve the problem because the for loop may load the resource from an 
> incorrect assembly.
> With the suggested code change, I think this means that its not possible to 
> ship an assembly with embedded resources in this structure and guanrentee 
> that the correct resource will be loaded under VB.Net:
>  Resources\SqlMaps\SqlServer\User.xml
>  Resources\SqlMaps\OleDb\User.xml
>  Resources\SqlMaps\Oracle\User.xml
> Perhaps we should caution users who are developing in for deployment in 
> another language and recommend they use distinct filenames:
>  ???
>  Resources\SqlMaps\SqlServer-User.xml
>  Resources\SqlMaps\OleDb-User.xml
>  Resources\SqlMaps\Oracle-User.xml
> -1 for VB.Net

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to