[ 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.