短編小説:リソースは、実行時に、実行する必要がない場合でも、プロジェクトのすべての参照を使用します。
長い話:Autocad内で使用される.netdllを作成しています。これは.netフォームのコレクションです。もちろん、プロジェクトはいくつかのautocaddllを参照しています。テストを支援するために、フォームコードをAutoCADコードから切り離しました。したがって、projをdllとしてコンパイルすると、autocadで使用できます。exeとしてコンパイルすると、フォームが読み込まれます(モックオブジェクトをデータとして使用)。リソースを使用してフォームに画像を追加する場合を除いて、すべて問題ありません。
Image img = global::myproj.Properties.Resources.myimage;
これにより、実行時に次のエラーが発生します。
System.IO.FileNotFoundException was unhandled
Message="Could not load file or assembly 'acmgd, Version=17.1.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified."
AutoCADを使用していないため、そのdllをロードできません。ただし、プロジェクトの「exe」形式では必要ありません。実際、画像を削除すると(明らかに、autocadとは関係ありません)、すべてが機能します。これは、プロジェクトの「リソース」部分が実行時に、プロジェクトに含まれるすべてのdllを参照するようなものです...使用されていない場合でも。
AutoCAD dllを削除せずに、プロジェクトに画像を追加するにはどうすればよいですか?画像をプロジェクトの一部にしたい(つまり、ディスク上のどこかではなく、dll内に)。
ところで:autocaddllは単なる例です。プロジェクトをいくつかのアプリで「ホスト」する必要がある他のdllでも同じ問題が発生すると思います。
問題のある行:
pictureBox9.Image = global::MyProj.Properties.Resources.tdb2;
フルスタックトレース:
System.IO.FileNotFoundException was unhandled
Message="Could not load file or assembly 'acmgd, Version=17.1.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified."
Source="mscorlib"
FileName="acmgd, Version=17.1.0.0, Culture=neutral, PublicKeyToken=null"
FusionLog="=== Pre-bind state information ===\r\nLOG: User = user\r\nLOG: DisplayName = acmgd, Version=17.1.0.0, Culture=neutral, PublicKeyToken=null\n (Fully-specified)\r\nLOG: Appbase = file:<full path>/\r\nLOG: Initial PrivatePath = NULL\r\nCalling assembly : MyProj, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.\r\n===\r\nLOG: This bind starts in default load context.\r\nLOG: No application configuration file found.\r\nLOG: Using machine configuration file from C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\config\\machine.config.\r\nLOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).\r\nLOG: Attempting download of new URL file:<full path>/acmgd.DLL.\r\nLOG: Attempting download of new URL file:<full path>/acmgd/acmgd.DLL.\r\nLOG: Attempting download of new URL file:<full path>/acmgd.EXE.\r\nLOG: Attempting download of new URL file:<full path>/acmgd/acmgd.EXE.\r\n"
StackTrace:
at System.ModuleHandle.ResolveMethod(Int32 methodToken, RuntimeTypeHandle* typeInstArgs, Int32 typeInstCount, RuntimeTypeHandle* methodInstArgs, Int32 methodInstCount)
at System.ModuleHandle.ResolveMethodHandle(Int32 methodToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext)
at System.Reflection.CustomAttributeData..ctor(Module scope, CustomAttributeRecord caRecord)
at System.Reflection.CustomAttributeData.GetCustomAttributes(Module module, Int32 tkTarget)
at System.Reflection.CustomAttributeData.GetCustomAttributes(Assembly target)
at System.Resources.ResourceManager.GetNeutralResourcesLanguage(Assembly a, UltimateResourceFallbackLocation& fallbackLocation)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream)
at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture)
at MyProj.Properties.Resources.get_tdb2() in <full path>Resources.Designer.cs:line 93
at MyProj.MyForm.InitializeComponent() in <full path>\MyForm.Designer.cs:line 524
at MyProj.MyForm..ctor() in <full path>\MyForm.cs:line 28
at MyProj.MyForm.tabPage_Enter(Object sender, EventArgs e) in <full path>\MyForm.cs:line 121
at System.Windows.Forms.Control.OnEnter(EventArgs e)
at System.Windows.Forms.TabPage.OnEnter(EventArgs e)
at System.Windows.Forms.TabPage.FireEnter(EventArgs e)
at System.Windows.Forms.TabControl.OnSelected(TabControlEventArgs e)
at System.Windows.Forms.TabControl.WmSelChange()
at System.Windows.Forms.TabControl.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
at System.Windows.Forms.Control.WmNotify(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.TabControl.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at PidXp.MyForm.Main() in <full path>\MyForm.cs:line 23
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
(一部のパス/名前が置き換えられました)